Keyboardhook



  • x3l33t schrieb:

    wie mache ich das mit PostThreadMessage?

    Ähm *räusper*,
    bist Du Dir wirklich sicher, daß Du einen Keyboardhook benötigst?

    Ich vermute, Du willst nur einfach und "ganz normal" für Dein Programm die Tastendrücke abfragen (also ohne diese Hooks)?
    (Die Vermutung deshalb, weil es mir den Anschein hat, daß Du nicht viel Grundlagenwissen über Nachrichten in Windows hast?)

    Was genau macht eigentlich Dein Hauptprogramm ohne Nachrichtenschleife?

    Das sieht mir nach einer dauer-residenten "Böse"-Software aus.
    Welche nicht auf normalem Wege beendet werden kann, denn dafür brauchst Du die Auswertung einer WM_QUIT-Nachricht!

    Martin


  • Mod

    x3l33t schrieb:

    wie mache ich das mit PostThreadMessage?

    Lesen kann nicht schaden oder?
    http://msdn.microsoft.com/en-us/library/ms644946(VS.85).aspx

    Im Detail:

    The thread to which the message is posted retrieves the message by calling the GetMessage or PeekMessage function. The hwnd member of the returned MSG structure is NULL.

    Bist Du Dir sicher, dass Du nicht über das Ziel hinausschießt?
    Wenn Du diese Frage schon stellst, dann ist ein Hook vermutlich jenseits Deiner Programmiererkapazität...



  • kann ich die Post dann mit PeekMessage abfangen?



  • ok ihr habt recht ich mach es doch mit nem verstecktem Fenster:

    // in WinMain
    	HWND hwndDia = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, KeyboardDlg);
    	SetupHook(hwndDia);
    
    // der Dialog
    BOOL CALLBACK KeyboardDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_INITDIALOG:
    		 return TRUE;
    
    	case WM_USER + 2:
    		 if ((wParam>='A' && wParam<='Z') || (wParam>='0' && wParam<='9'))
    		 {
    		     char c = static_cast<char>(wParam);
    			 MessageBox(0, (LPCSTR)c, (LPCSTR)c, 0);
    		 }
    		 return TRUE;
    	}
    
    	return FALSE;
    }
    

    warum bekomme ich keine MessageBox wenn ich ne taste drücke?



  • der Hook ist der aus der FAQ



  • Du kannst nicht einfach so einen char zu einem string casten



  • das hat aber ichts damit zu tun WM_USER+2 wird nicht aufgerufen



  • einsichtig schrieb:

    warum bekomme ich keine MessageBox wenn ich ne taste drücke?

    einsichtig schrieb:

    das hat aber ichts damit zu tun WM_USER+2 wird nicht aufgerufen

    Wer schickt denn die Nachricht "WM_USER+2" ?
    Und wann wird sie gesendet?
    Und an welches Fenster?

    Ohne diese Information funktioniert unsere Wahrsager-Kugel schlicht und einfach nicht um Deine Frage beantworten zu können 😞

    Daher nochmal: Ich habe den Eindruck, daß:
    -die Grundlagen der Windows-Nachrichten (Messages) nicht verstanden worden sind und
    -ein Keyboard-Hook aufgrund der bisher hier festgestellten "Mängel" wahrscheinlich der völlig falsche Ansatz ist (in etwa so wie mit Kanonen auf Spatzen schießen)

    Nimm eine Nachrichtenschleife und werte in den Proceduren die Nachrichten WM_KEYDOWN (oder WM_CHAR) aus.

    Martin

    P.S.: Daß ein Hook in einer FAQ steht, heißt noch lange nicht, daß Du ihn unbedingt einsetzen mußt...



  • char c = static_cast<char>(wParam);
    			 MessageBox(0, (LPCSTR)c, (LPCSTR)c, 0);
    

    lol.

    Mmacher schrieb:

    Wer schickt denn die Nachricht "WM_USER+2" ?
    Und wann wird sie gesendet?
    Und an welches Fenster?

    Ohne diese Information funktioniert unsere Wahrsager-Kugel schlicht und einfach nicht um Deine Frage beantworten zu können

    einsichtig schrieb:

    der Hook ist der aus der FAQ

    lol.



  • ohh wie toll supermeister ascda kann natürlich nur lollen und der andere ließt meinen Code nicht.

    HWND hwndDia = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, KeyboardDlg);
        SetupHook(hwndDia);
    

    ist doch eindeutig welches Fenster oder hwnd das ist oder nicht?



  • extern "C" __declspec (dllimport) BOOL CALLBACK SetupHook (HWND) ;
    extern "C" __declspec (dllimport) BOOL CALLBACK UninstallHook (void) ;
    

    so habe ich sie deklariert im Programm stimmt doch oder?
    Ist echt wichtig



  • irgendwie hängt sich der Dialog auf.
    Wenn ich mit der Maus drüber gehe kommt die ganze zeit die Sanduuhr dann kackt es ab.
    Hier der Dialog Code:
    warum hängt sich der Dialog auf?

    in Win main:
    	HWND hwndDia = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, KeyboardDlg);
    	ShowWindow(hwndDia, TRUE);
    	SetupHook(hwndDia);
    
    das ist der Callback
    BOOL CALLBACK KeyboardDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_INITDIALOG:
    		 return TRUE;
    
    	case (WM_USER + 2):
    		 if ((wParam>='A' && wParam<='Z') || (wParam>='0' && wParam<='9'))
    		 {
    		     char c = static_cast<char>(wParam);
    			 MessageBox(0, (LPCSTR)c, (LPCSTR)c, 0);
    		 }
    		 return TRUE;
    	}
    
    	return FALSE;
    }
    


  • einsichtig schrieb:

    Wenn ich mit der Maus drüber gehe kommt die ganze zeit die Sanduuhr dann kackt es ab.

    Dürfen Nicht-Fäkal-Programmierer auch etwas zur Lösung beitragen?

    Wenn ja, dann poste mal den Code (nicht Kot!) der WinMain!


Anmelden zum Antworten