Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C++] Keyboard hook werkt niet

Pagina: 1
Acties:

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 07:05
Hallo,

Ik probeer een (globale) keyboard hook te zetten in C++ zodat alle keystrokes opgevangen worden binnen mijn applicatie.

Dit probeer ik op de volgende manier te doen:

KeyboardHook.cc:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void KeyboardHook::installHook() 
{
    cout << "Installing hook" << endl;
    p_hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId());
    //p_hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, GetCurrentThreadId());
}

void KeyboardHook::removeHook() 
{
    if (UnhookWindowsHookEx(p_hook)) {
        cout << "Unhooked" << endl;
    } else {
        cout << "Could not unhook" << endl;
    }
}

LRESULT CALLBACK KeyboardHook::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    Beep( 750, 50 );
    cout << "got keystroke" << endl << flush;

    // Pass info to next hook
    return CallNextHookEx(NULL, nCode, wParam, lParam );
}


Aanroep:
C++:
1
2
3
    KeyboardHook * kbHook = new KeyboardHook();
    kbHook->installHook();
    //kbHook->removeHook();


Als test heb ik even de beep code en de cout code gedaan, dit wordt uiteraard vervangen. De callback functie wordt alleen helemaal niet aangeroepen.
Na het setten van de hook krijg ik netjes de handle terug van de ingestelde hook. De removeHook() functie werkt ook, en geeft netjes terug dat de hook is verwijderd.

Wat doe ik hier fout? De voorbeelden die ik op internet heb gevonden maken allemaal gebruik van een aparte DLL. Is het wel mogelijk om de hook in te stellen vanuit de app zelf?

...


  • IceM
  • Registratie: Juni 2003
  • Laatst online: 07:05
Iets beter zoeken in het vervolg, sorry.
..All global hook functions must be in libraries...

...


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Moet in een DLL idd, omdat de code vanuit je kernel wordt aangeroepen, en dat is een andere process space. Een DLL kan daar mee omgaan (relocatie), een gewone applicatie niet. (plus beveiligingsissues)

[ Voor 6% gewijzigd door Zoijar op 27-06-2008 11:36 ]