Archief - [PROG][C++] Prog laten lopen in de achtergrond

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

xytro

Legacy Member
Als ge denkt dat het hier om een keylogger gaat, dat is het niet.
Wat ik zou willen bereiken is gewoon een app die op de achtergrond draait, en die bepaalde keys registreerd. Het is om winamp aan te sturen terwijl ik aan het gamen ben.

Winamp aansturen lukt al zonder probleem, alleen moet die mn key presses nog registeren terwijl dat het venster niet meer active is.

Als iemand een link heeft naar goeie info hieromtrent zou ik die dankbaar zijn ;)

FluX.iccd

Legacy Member
Ik denk dat dat mogelijk is met directinput, met SetCooperativeLevel() kan je DISCL_BACKGROUND meegeven als flag.

Uit de sdk:
DISCL_BACKGROUND
The application requires background access. If background access is granted, the device can be acquired at any time, even when the associated window is not the active window.

Best zelf eens meer info opzoeken op google of in de sdk, van mij is het te lang geleden :)

killgore

Legacy Member
GetAsyncKeyState

edit: ik werk dus zo:

bij WM_CREATE of zo:

SetTimer(hwnd, ID_TIMER, TIMER_INTERRUPT, NULL);
ID_TIMER is hier 1 en TIMER_INTERUPT iet van 500 of zo (miliseconde ;))

dan bij WM_TIMER msg roep ek mijn functie aan die die async key behandeld

die ziet er bv. zo uit:

Code:
void keystate()
{
    if( GetAsyncKeyState(VK_F10) &1)
    {
        //knop gedrukt in de laatste xx seconden, voer die knop zen actie uit
    }
}

die & 1 checkt of die knop is ingedrukt sinds de laatste GetAsyncKeyState aanroep, je kan ook bv. checken op ~1, dan controleer je of de knop op het moment van aanroep is ingedrukt (nogal onnodig voor jou).

Natuurlijk: als je meerdere timers gebruikt, zorg dat je de juiste timer gebruikt voor juiste job he :p

fretn

Legacy Member
hmm killgore, werkt dit ?
ik herinner me dat ik jaar of twee geleden een progje aan het maken was (nooit gefinished :p) die een druk op de screenshotkey moest detecteren (om dan een vensterke te geven waar je als jpg enzo kon saven, ala linux), en niets werkte als m'n prog geen focus (of zichtbaar venster) had

de enige manier was de keylogger manier via een dll, maar na wat gegoogle dan toch iets gevonden om een keylogger zonder dll te laten werken

wat het exacte probleem was kan ik me niet meer herinneren, maar ik weet dat ik er hevig op gevloekt heb :D en ik vloek terug als ik zie als het zo simpel kon :p

killgore

Legacy Member
99% zeker da et werkt

ik maakte men trainers zo :p

edit: kan wel zijn dat het in conflict komt mssch met andere progs die die functie gebruiken, dunno of die functie systeem of thread (programma) gebonden is ;).

xytro

Legacy Member
Thx voor de reply's, kga er vandaag nog wa mee expirimenteren ;)

Da Turtle

Legacy Member
FluX.iccd zei:
Ik denk dat dat mogelijk is met directinput, met SetCooperativeLevel() kan je DISCL_BACKGROUND meegeven als flag.

Uit de sdk:


Best zelf eens meer info opzoeken op google of in de sdk, van mij is het te lang geleden :)
Deze zal enkel lukken als je game niet DISCL_EXCLUSIVE ofzo gebruikt denk ik. Als dat wel zo is gaat et wel minder zijn :p.

S3cT0r

Legacy Member
Die GetASyncKeyState is wel nice en makkelijk, maar om constant te monitoren moet het in een soort oneindige lus alla while (1) { GetASync... }, en dat toont dus altijd 99% CPU verbruik, dat is niet netjes. Of doe ik soms iets verkeerd?

killgore

Legacy Member
S3cT0r zei:
Die GetASyncKeyState is wel nice en makkelijk, maar om constant te monitoren moet het in een soort oneindige lus alla while (1) { GetASync... }, en dat toont dus altijd 99% CPU verbruik, dat is niet netjes. Of doe ik soms iets verkeerd?
zoals ik zei: aangezien je toch in winapi prolly werkt: timer gebruiken ;). om de halve seconde checken zal wel volstaan :).

killgore

Legacy Member
Silenger.BE zei:
gebruik gewoon sleep(30); in loop...
kvraag me af wrom mensen van die dubieuze sleep functies willen gaan gebruik maken

als je asynckey gebruikt maak je zowiezo gebruik van winapi, maak er dan in 1 keer ook deftig gebruik van he :).

Silenger.BE

Legacy Member
??? Sleep is een pure win api functie, dit zet de thread die dit called op een suspended state voor een gewenste tijd, zodat deze zelf geen cpu time waste.
Als je een GUI hebt moet je wel zien dat je de main thread niet laat slapen, of je zal messages moeten updaten in je loop :p

killgore

Legacy Member
Sleep is winapi, sleep niet, ma dunno welke header je daarvoor weer moet includen (en sorry voor het muggenziften ze :p).

Al bij al blijft sleep lelijke manier van programmeren, zoals ik zei: meestal kan je dit wel omzeilen via een timer.

fretn

Legacy Member
fretn zei:
hmm killgore, werkt dit ?
ik herinner me dat ik jaar of twee geleden een progje aan het maken was (nooit gefinished :p) die een druk op de screenshotkey moest detecteren (om dan een vensterke te geven waar je als jpg enzo kon saven, ala linux), en niets werkte als m'n prog geen focus (of zichtbaar venster) had

de enige manier was de keylogger manier via een dll, maar na wat gegoogle dan toch iets gevonden om een keylogger zonder dll te laten werken

wat het exacte probleem was kan ik me niet meer herinneren, maar ik weet dat ik er hevig op gevloekt heb :D en ik vloek terug als ik zie als het zo simpel kon :p

Code:
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <winuser.h>
#include <stdio.h>

HHOOK hKeyHook;

__declspec(dllexport) LRESULT CALLBACK KeyEvent (int nCode, WPARAM wParam, LPARAM lParam) 
{

    KBDLLHOOKSTRUCT *hooked = ((KBDLLHOOKSTRUCT*)lParam);

    if  ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYUP) || (wParam == WM_KEYUP))) 
	{

		if (hooked->vkCode == VK_SNAPSHOT) 
		{
			MessageBox(NULL, "screenshot", "screenshot", MB_OK);	
		}
	}


    return CallNextHookEx(hKeyHook, nCode,wParam,lParam);
}

// This is a simple message loop that will be used
// to block while we are logging keys. It does not
// perform any real task ...

void MsgLoop()
{
    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}


DWORD WINAPI KeyCatcher(LPVOID lpParameter) {


    HINSTANCE hExe = GetModuleHandle(NULL);

    if (!hExe) 
		hExe = LoadLibrary((LPCSTR) lpParameter); 

//  Everything failed, we can't install the hook ... this
//  never happened, but error handling is important.

    if (!hExe) 
		return 1;

    hKeyHook = SetWindowsHookEx (WH_KEYBOARD_LL, (HOOKPROC) KeyEvent, hExe, NULL);

    MsgLoop();

    UnhookWindowsHookEx(hKeyHook);
    return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{

	MSG			Msg;

	HANDLE hThread;
    DWORD dwThread;
    DWORD exThread;

	HANDLE hInstanceMutex = ::CreateMutex(NULL,TRUE, "SINGLE.MUTEX"); // no multiple instances

	if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
        if(hInstanceMutex)
            CloseHandle(hInstanceMutex);

        return 0;
    }


    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)KeyCatcher, (LPVOID) NULL, NULL, &dwThread);


    while(GetMessage(&Msg, NULL, 0, 0) && GetExitCodeThread(hThread, &exThread)) 
	{
		TranslateMessage(&Msg);
        DispatchMessage(&Msg);

		if (exThread == STILL_ACTIVE) 
			Sleep(10); 


    }

    return Msg.wParam;
}

'k heb dus m'n code opgezocht en die keycatcher er uit gefiltert, zo werkte het dus :)

killgore

Legacy Member
omdak begon te twijfele door u fretn hebbek gauw gauw (niet echt proper dus :p) iets ineengeflanst om het te testen, en dit werkte perfect:

Code:
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
	cout << "waiting for external F10" << endl;
	while(!(GetAsyncKeyState(VK_F10) & 1) )
	{
		Sleep(200);
	}
	cout << "F10 received" << endl;
	cin.get();
	return 0;
}

als je uit dat proggie gaat en je drukt ergens anders op F10 (zelfs bureaublad :p) dan vangt hij het op :).
Natuurlijk kan je dit nog extra limiteren tot 1 process door extra te controleren of dat process de input focus heeft :).

edit: kheb is 5 instanties gestart: die functie is dus systeemsgebonden en niet per programma, als een ander programma eerst die key opvangt krijg jij hem niet meer doorgestuurd ;).

fretn

Legacy Member
ik denk dat 'mijn' proggie, altijd de keys opvangt, en dat je ook alle keys kan opvangen zonder dat je if's moet specifieren voor iedere key (tis een keylogger)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan