lokalen Hook einrichten -> Compiler spuckt mir unerklärliche Fehlermeldung aus :(



  • hey danke, hat funktioniert... jetzt hab ich aber ein neues problem... der Hook wird eingerichtet, es wird "Hook wurden erfolgreich installiert!" ausgegeben, jedoch wird myHookProc nie ausgeführt... die funktion sieht jetzt zu testzwecken so aus:

    LRESULT CALLBACK myHookProc(
                       int nCode,
                       WPARAM wParam,
                       LPARAM lParam
                       )
    {
                       if( nCode < 0 )
                           return CallNextHookEx(aHook,nCode,wParam,lParam);
                       if(nCode == HC_ACTION)
                       {
                                ofstream fout("c:\\test.txt");
                                fout << "test";
                       }
                       return CallNextHookEx(aHook,nCode,wParam,lParam);
    }
    

    habs auch schon mit cout und anderen sachen probiert, aba die funktion wird einfach nicht aufgerufen... was ist da faul?

    PS: ein GetLastError() direkt vor programmende gibt mir eine 0 zurück, sollte also eigentlich alles glatt laufen 😞



  • tach,

    ich glaub dein fehler liegt darin, dass dein hook gestartet wird, geprüft wird ob er läuft, und gleich wieder beendet wird!

    ich hatte mal nen hook geproggt, den hatte ich in nem thread gestartet, und im hauptprozess gewartet bis ich den hookthread wieder beende.

    bei dir hat der hook gar keine chance, weil er ,wie gesagt, sofort wieder beendet wird nachdem du in startest.

    int main(int argc, char *argv[])
    {
    
        // hook wird gestartet
        aHook = SetWindowsHookEx(
                                 WH_KEYBOARD,
                                 myHookProc,
                                 NULL,
                                 GetCurrentThreadId()
                                 );
    
        //handle wird geprüft
        if( aHook == NULL)
            cout << "Hook wurde nicht installiert!" << endl;
        else
            cout << "Hook wurde erfolgreich installiert!" << endl;
    
        /////////////////////////////////////////////////////////
        // und hier gleich wieder beendet
        /////////////////////////////////////////////////////////
        UnhookWindowsHookEx(aHook);
    }
    

    dein code ist ansonsten ok.

    grüsse!



  • hab mal

    for(int i=0;i<5;i++)
        getch();
    

    vor dem UnhookWindowsHookEx eingefügt, damit sollte das von dir beschriebene problem doch behoben sein und zumindest 5 mal der hook angesprochen werden oder? es passiert aber leider ebenfalls nichts 😞



  • wenn man schon crossposting betreibt, sollte man schon bei beiden Boards vorbeischauen :xmas1: :
    http://www.buha.info/board/showthread.php?t=50935
    Zumindest wäre das meine Version - MSDN sagt
    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/keyboardproc.asp

    The KeyboardProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function whenever an application calls the GetMessage or PeekMessage function and there is a keyboard message (WM_KEYUP or WM_KEYDOWN) to be processed.

    Du dagegen benutzt Konsole.



  • hey, das mit dem doppelposting tut mir echt leid, wusste nicht dass die beiden board irgendwie zusammen gehören oda so... dachte mir ich frage halt gleich mal an mehreren stellen...

    zurück zum thema... bedeutet das, dass ich keine chance habe den hook in ner konsolenanwendung zum laufen zu kriegen?



  • nein, in ner reinen konsolenanwendung wird's nich funktionieren, jedenfalls nich ohne weiteres.
    es könnte funktionieren wenn der hook in ner win32 anwendung erzeugt wird, und das systemweit (dll), dann kannst du auch konsoleneingaben von eingabeaufforderung abfangen.



  • Siehe: How To Hook Console Applications and the Desktop
    http://support.microsoft.com/kb/108232/en-us

    Der KB-Artikel ist zwar alt, aber ich denke, dass er noch immer gültig ist.
    Fazit: Console-Applikations können AFAIK nicht so einfach gehooked werden...



  • danke leute, ihr habt mir sehr geholfen!
    hab mittlerweile sogar nen globalen Hook hinbekommen 🙂
    jetzt steh ich aba vor nem neuen problem:
    wenn der WH_KEYBOARD-Hook ne Message abfängt, dann kriegt er ja den virtual-key-code. wie krieg ich den jetzt in den korrekten character umgewandelt? also "a" bzw "A" oda "!" bzw "1"?



  • ToAsciiEx



  • ok, ich hab's mittlerweile so weit hinbekommen, dass alles ganz gut funzt, mit nem globalen low-level keyboard hook... jetzt hab ich nur noch folgendes, mir unerklärliches problem:

    wenn ich ein "A" (SHIFT+a) im hook-fenster mache, dann schreibt mir der hook auch ein "A" in die textdatei. mache ich jetzt aber außerhalb des hook-fensters ein "A" (SHIFT+a) dann macht er mir ein "a"... ich komm einfach nicht drauf wieso...

    LRESULT CALLBACK myHookProc(int nCode,WPARAM wParam,LPARAM lParam)
    {       
            if( nCode < 0 )
                return CallNextHookEx(aHook,nCode,wParam,lParam);
            if( nCode == HC_ACTION && wParam==WM_KEYDOWN ) // Only keydown...
            {
                std::ofstream fout("c:\\test.txt",fout.app);
                KBDLLHOOKSTRUCT hook = *((KBDLLHOOKSTRUCT*)lParam);
                switch( hook.vkCode )
                {
                        case VK_RETURN:
                             fout << std::endl;
                             break;
                        case VK_SPACE:
                             fout << " ";
                             break;
                        default:
                                if( hook.vkCode >= 48 && hook.vkCode <=90 ) // Only letters and numbers...
                                {
                                    BYTE ks[256];
                                    GetKeyboardState(ks);
                                    WORD w;
                                    ToAscii(hook.vkCode,hook.scanCode,ks,&w,0);
                                    fout << char(w);
                                    fout.close();
                                }
                                break;
                }
            }
            return CallNextHookEx(aHook,nCode,wParam,lParam);
    }
    

Anmelden zum Antworten