tastatur- und maus-spion



  • hi,

    ich wollte ein programm schreiben, welches in einer datei speichert, wie oft die linke maustaste oder z.B. das "A" gedrückt wurde. dazu müsste mein programm also alle nachrichten und nicht nur seine eigenen erhalten. gibt es also einen befehl, der windows sagt, dass mein programm alle nachrichten erhalten will?



  • Dafür müsstest du wohl mit SetWindowsHookEx einen Keyboard- bzw. Mouse-Hook einrichten. Code-Beispiel dazu gibt es auch in den FAQ 🙂



  • oh, okay, danke



  • ich hab jetzt folgendes script gebastelt:

    #include <windows.h>
    #include <stdio.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK HookProc(int, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	static TCHAR szAppName[] = "Bla";
    	HWND		hWnd;
    	MSG			msg;
    	WNDCLASS	wndclass;
    
    	wndclass.style			= CS_HREDRAW | CS_VREDRAW;
    	wndclass.lpfnWndProc	= WndProc;
    	wndclass.cbClsExtra		= 0;
    	wndclass.cbWndExtra		= 0;
    	wndclass.hInstance		= hInstance;
    	wndclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
    	wndclass.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wndclass.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wndclass.lpszMenuName	= NULL;
    	wndclass.lpszClassName	= szAppName;
    
    	RegisterClass(&wndclass);
    
    	hWnd = CreateWindow(	szAppName,
    							"Bla",
    							WS_OVERLAPPEDWINDOW,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							CW_USEDEFAULT,
    							NULL,
    							NULL,
    							hInstance,
    							NULL);
    
    	ShowWindow(hWnd, iCmdShow);
    	UpdateWindow(hWnd);
    
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    HHOOK	hhk;
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	FILE	*fp;
    
    	switch (message)
    	{
    	case WM_CREATE:
    		hhk = SetWindowsHookEx(WH_KEYBOARD, HookProc, ((LPCREATESTRUCT)lParam)->hInstance, 0L);
    		return 0;
    
    	case WM_DESTROY:
    		fp = fopen("log.txt", "a");
    		fputc('\n', fp);
    		fclose(fp);
    
    		UnhookWindowsHookEx(hhk);
    		PostQuitMessage(0);
    		return 0;
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	FILE	*fp;
    
    	if (nCode == HC_ACTION)
    	{
    		if ((lParam & 1073741824) != 1073741824)
    		{
    			fp = fopen("log.txt", "a");
    			fputc((char)wParam, fp);
    			fclose(fp);
    		}
    	} 
    	return CallNextHookEx (hhk, nCode, wParam, lParam) ; 
    }
    

    aber wieso funktioniert es nur, wenn man im fenster des programms eine taste drückt?



  • Wenn du einen systemweiten Hook brauchst, muss das in einer DLL sein...



  • achso, mal sehen ob ich das hinbekomme...


Anmelden zum Antworten