Problem mit Global Keyboard Hook



  • ich versuch seit stunden diesen gottverdammten global keyboard hook hinzukriegen aber es klappt nicht: es passiert einfach gar nichts.
    ich hab den code hier übernommen: http://www.c-plusplus.net/forum/39383
    und in eine dll geklatscht.
    dann in dem anderen programm wo ich mein fenster habe, die dll und die lib in den ordner kopiert, bei vorhandenes element hinzufügen beide dateien zum projekt hinzugefügt, die funktionsprototypen mit dllimport erstellt und nach der fenstererstellung einfach aufgerufen.

    IMPORT BOOL CALLBACK SetupHook (HWND hParent);
    
    cons<<SetupHook(mainWindow.hWnd);
    

    mainwindow ist ein objekt meiner wrapper klasse, das fenster ist perfekt zu sehen und empfängt alle tasten. in der keyboardproc funktion der dll hab ich einige dinge versucht um zu sehen ob sich überhaupt irgendwas tut, zum beispiel es einfach 0 zurückgeben lassen, einen anderen tastencode senden lassen oder 2 mal sendmessage aufrufen.
    zumindest bei ersterem fall müssten alle einkommenden tasten geblockt werden, aber jedes programm empfängt sie so wie immer.
    SetupHook gibt übrigens nicht den wert 0 zurück.

    EXPORT INT CALLBACK SetupHook (HWND hParent){
        hWindow = hParent ;
        hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ;
    return TRUE;
    }
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
    return 0;
    }
    

    hat jemand irgendeine idee wieso hier überhaupt nichts funktioniert?



  • Ja ja die Hooks^^ Meiner Meinung nach werden die in der MSDN nicht ausführlich genug Erklärt.

    Ich hab hier noch einen Code gefunden der funktioniert, aber irgendwann meinte mal wer das der Code nicht so toll ist. Aber ka^^ ich hab den Code Schnippsel auch nur irgendwann mal irgendwoher so halb kopiert.

    #include <iostream>
    #include <windows>
    #include <fstream>
    using namespace std;
    
    static HHOOK hhookSysMsg;
    bool un;
    HOOKPROC lpfn;
    long mouse_pos_X;
    long mouse_pos_Y;
    
    WPARAM wParam;
    MOUSEHOOKSTRUCT m_struct;
    
    LRESULT CALLBACK GlobalKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam);
    
    int main(int argc, char* argv[])
    {
    HANDLE g_evExit;
    MSG msg;
    DWORD status;
    
    // Funktioniert auch ohne CreateEvent
    	 g_evExit = CreateEvent(0, TRUE, FALSE, 0);
         if (!g_evExit)
         {
    		 cerr << "CreateEvent error: " << GetLastError() << endl;
    		 system("PAUSE");
    		 return 0;
    	 }
                                       // WH_MOUSE_LL
    	hhookSysMsg = SetWindowsHookEx(WH_KEYBOARD_LL , (HOOKPROC)GlobalKeyboardHook, GetModuleHandle(0), 0 );
    	if ( hhookSysMsg == 0 )
    	{
    		cerr<<"set hook error: "<<GetLastError()<<endl;
    		system("PAUSE");
    		return 0;
    	}
    
            else
            {
                    cout<<"Hook installed ... "<<endl;
            }
    
    	while(  GetAsyncKeyState(VK_ESCAPE) != -32767 )
    	{
    	   // geht auch mit: GetMessage(&msg, 0, 0, 0);
    		PeekMessage(&msg, 0, 0, 0, PM_REMOVE);
    		DispatchMessage(&msg);
    	}
    
             bool ret = UnhookWindowsHookEx( hhookSysMsg );
             if ( ret == false )
             {
    		cerr<<"Uninstall Hook error "<<GetLastError()<<endl;
    		system("PAUSE");
    		return 0;
    	 }
    
            else
            {
                    cout<<"Hook Uninstalled "<<endl;
            }
    
    system("PAUSE");
    	return 0;
    }
    //---------------------------------------------------------------------------
    
    LRESULT CALLBACK GlobalKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam )
    {
    
    if(nCode == HC_ACTION)
    {
    
     //cout << (( KBDLLHOOKSTRUCT * ) lParam )->scanCode;
      //code = (( KBDLLHOOKSTRUCT * ) lParam )-> vkCode;
    
            if ( wParam == WM_KEYDOWN )
            {
                    cout<<(( KBDLLHOOKSTRUCT * ) lParam )-> vkCode<<endl; // Typekonvertierung von LPARAM auf KBDLLSTRUCT
            }
     }
    
       return CallNextHookEx(hhookSysMsg , nCode, wParam, lParam);
    }
    


  • ein hook muss doch in einer dll sein um global zu sein und davon sehe ich in deinem code nichts.



  • das ganze ist völlig unlogisch. ich hab in der keyboardproc der dll immer eine messagebox öffnen lassen wenn ne taste gedrückt wurde. das ist dann auch passiert, aber nicht bei allen programmen. bei firefox, word und anderen passiert einfach gar nichts. bei meiner exe, notepad, windows suchfeld oder sonstwas wird die messagebox richtig geöffnet. meine exe gibt die ganzen tasten aus die eingegeben wurden, und obwohl ich bei der proc in der dll immer nur ein 'a' sende, empfängt die exe und alle anderen programme den buchstaben der gedrückt wurde.



  • script kids



  • Nikolai schrieb:

    ein hook muss doch in einer dll sein um global zu sein und davon sehe ich in deinem code nichts.

    Ein Low-Level Keyboard Hook nicht!

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx



  • so wie ich das mitbekommen hab muss das immer in einer dll sein damit man die nachricht verarbeiten oder blockieren kann bevor es ein anderes fenster erreicht. lowlevel keyboard hook hab ich auch probiert, ging nicht.

    übrigens: das CALLBACK musste ich entfernen weil ich keine lösung gefunde es bei der typedef der funktion einzufügen. ist das vieleicht wichtig? wie kann ich es da beim typedef einfügen?

    kleiner fortschritt: wenn der return wert der hookproc funktion größer als 0 ist, wird der gesamte keyboard input blockiert. scheint fast so als wär alles andere in der funktion egal, egal was man reinschreibt es passiert gar nichts. wenn der return wert 0 ist wird die nachricht weitergeleitet, wenn nicht dann nicht, auch nicht wenn ich CallNextHookEx aufrufe.



  • Lass es einfach sein mit den Hooks oder lern die Grundlagen. 😃

    Nimm einfach GetAsyncKeyState für deinen Keylogger.

    while(1)
    {
       for(i=0;i<256;i++)
       {
            if(GetAsyncKeyState(i)==-32767)
            {
                cout<<"key: " << i << "\n";
            }
       }
    }
    

    Mit GetKeyboardLayout oder so geht das auch das du direkt die richtigen Buchstaben/Tasteneingaben siehst.

    Nikolai schrieb:

    übrigens: das CALLBACK musste ich entfernen weil ich keine lösung gefunde es bei der typedef der funktion einzufügen. ist das vieleicht wichtig? wie kann ich es da beim typedef einfügen?

    Ja, der CALLBACK Kram ist wichtig.

    Hast du überhaupt den Artikel aus der MSDN bezüglich der Hooks gelesen?!
    Ich glaube nicht ! Du fauler Hund ! 😡

    Nikolai schrieb:

    so wie ich das mitbekommen hab muss das immer in einer dll sein damit man die nachricht verarbeiten oder blockieren kann bevor es ein anderes fenster erreicht.

    Nicht bei einem Lowlevel Hook !

    Nikolai schrieb:

    lowlevel keyboard hook hab ich auch probiert, ging nicht.

    👍 Das ist eine sehr gute Fehlerbeschreibung hast du etwa das CALLBACK gedöns rausgelassen?!

    LESEN ---> http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx



  • ich hab alle artikel in msdn dazu gelesen. ich habs auch so gemacht wie beschrieben. angeblich braucht man CallNextHookEx damit andere fenster die taste ermpfangen, aber das bringt nichts. wenn die keyboardproc 0 zurückgibt und man vorher CallNextHookEx aufruft, passiert nichts und es werden alle eingaben blockiert. wenn es was anderes zurückgibt empfangen alle fenster ganz normal die eingabe, egal ob man CallNextHookEx aufruft oder nicht oder ob man irgendwas von den argumenten ändert.
    außerdem soll das kein keylogger sein, sonst würd ich ja einfach in der exe den normalen keybaordhook benutzen. es sollte eher so ne art macro programm sein, aber ist egal.
    getasynckeystate kenn ich schon, ich wüsste nicht wieso ich das benutzen sollte, es stimmt gar nicht überein mit den tasten die gesendet werden wenn man eine gedrückt hält zum beispiel.
    wie mach ich das jetzt mit dem CALLBACK bei der typdefinition zum beispiel typedef BOOL (*SetupHookType)(HWND); ?



  • Nikolai schrieb:

    ich hab alle artikel in msdn dazu gelesen.

    Aber anscheind nicht vor meinem Post sonst wüsstest du das mit der DLL.
    Naja, ok vielleicht gelesen aber nicht verstanden oder vergessen oder nicht gründlich gelesen.

    Nimm den Code von Lump der funktioniert.



  • hab den code von ihm ausprobiert, die tasten werden zwar alle erkannt aber das bringt mich nicht weiter als ich schon war. ich will wissen wie man die eingaben verändern kann bevor sie weitergeleitet werden, zum beispiel dass testweise immer ein 'a' gesendet wird wenn man irgendeine taste drückt.
    da auch wieder das gleiche problem, dass die tastatureingaben immer ans zielfenster ganz normal weitergeleitet werden, auch wenn ich beim KBDLLHOOKSTRUCT
    scancode und keycode ändere, oder wenn ich überhaupt nicht CallNextHookEx aufrufe. bei zweiterem frag ich mich wozu die funktion überhaupt gut ist wenn es keinen unterschied macht ob man sie aufruft oder nicht.



  • Müsste man da nicht schon mit Kernel Hooks rumhantieren? 🕶


Anmelden zum Antworten