Low-Level Keyboard Hook



  • Hallo,
    ich habe Probleme mit meinen LowLevel Keyboard Hook:

    SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LowLevelKeybdProc,hDllInstance,0);
    
    LRESULT CALLBACK LowLevelKeybdProc(int nCode,WPARAM wParam, LPARAM lParam)
    {
        if (nCode == HC_ACTION)
        {
    	switch(wParam)
    	{
                case WM_KEYDOWN:
    		DebugTrace("LowLevelKeyb...WM_KEYDOWN");
    		break;
    	    case WM_KEYUP:
    		DebugTrace("LowLevelKeyb...WM_KEYUP");
    		break;
    	    case WM_SYSKEYDOWN:
    		DebugTrace("LowLevelKeyb...WM_SYSKEYDOWN");
    		break;
    	    case WM_SYSKEYUP:
    		DebugTrace("LowLevelKeyb...WM_SYSKEYUP");
    		break;
    	}
            ....
        }
        return CallNextHookEx (NULL, nCode, wParam, lParam) ;
    }
    

    Lässt sich zwar fehlerfrei ausführen,
    aber ich bekomme wenn ich eine Taste 'normal' drücke nur
    einen WM_KEYUP!!
    Drücke eine Taste länger bekomme ich mehrere WM_KEYDOWN's
    aber auch erst nach den WM_KEYUP's!!

    Woran könnte das liegen?? 😕

    Wäre für jede Hilfe dankbar.



  • Hmm. Es ist prinzipiell völlig unmöglich, dass WM_KEYUP vor WM_KEYDOWN kommt. Lass mich noch darüber nachdenken. Ich hab auch mal ein LowLevelKeyboard-Hook geschrieben...



  • Ich denke es kann nur an deinem Code liegen...Ich vermute es könnte an der folgenden Zeile liegen:

    if (nCode == HC_ACTION)

    Hier ist mein Code:

    static LRESULT CALLBACK LLKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      //if (nCode < 0)
      //  return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
      static BOOL bEventSet = 0;
    
      PKBDLLHOOKSTRUCT pKbdStruct = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
      if(pKbdStruct->vkCode != VK_M)
        return 0; // return 0 = ok, return 1 = Input verwerfen
    
      switch (wParam)
      {
        case WM_KEYDOWN:
          switch(pKbdStruct->vkCode)
          {
            case VK_M:
              if(!bEventSet)
              {
                SetEvent(g_hEvent); // Signale Event, so that ThreadProc starts doing its job
                bEventSet = 1;
              }
              return 1;
              break;
          }
          break;
        case WM_KEYUP:
          switch(pKbdStruct->vkCode)
          {
            case VK_M:
              ResetEvent(g_hEvent); // Unsignale Event, so that ThreadProc stops doing its job
              bEventSet = 0;
              return 1;
              break;
          }
          break;
      }
    
      /**/
      LOG("Nachricht erhalten:\n");
      LOG("wParam = "<<wParam);
      /*
      switch (wParam)
      {
        case WM_SYSKEYDOWN:
          LOG(" WM_SYSKEYDOWN");
          break;
        case WM_SYSKEYUP:
          LOG(" WM_SYSKEYUP");
          break;
        case WM_KEYDOWN:
          LOG(" WM_KEYDOWN");
          break;
        case WM_KEYUP:
          LOG(" WM_KEYUP");
          break;
      }
      */
      LOG("vkCode = "<<pKbdStruct->vkCode<<endl);
      LOG("scCode = "<<pKbdStruct->scanCode<<endl);
      LOG("flags  = "<<pKbdStruct->flags<<( (pKbdStruct->flags & 0x10)?" injected":"" )<<endl);
      LOG("time   = "<<pKbdStruct->time<<endl);
      LOG("dwInfo = "<<pKbdStruct->dwExtraInfo<<"\n\n"<<endl);
      /**/
    
      return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam); // return 0 = ok, return 1 = Input verwerfen
    }
    


  • Danke für die Mühe.
    Hab meine Funktion mal durch deine
    ersetzt , hat aber leider keine Besserung gebracht,
    habe weiterhin nur die WM_KEYUP's bekommen.

    Gruss Alex.



  • Hast du das jetzt direkt im Hook getestet, oder über das Hauptprogramm?



  • Über's Hauptprogramm, denke ich.
    Ich verstehe nicht ganz was du mit direkt
    im Hook meinst.

    Grüsse Alex



  • Du könntest ja direkt in der Hook-Proc z.B. mit einer MessageBox testen, ob vielleicht der Fehler nur in der Weiterleitung liegt 🙄



  • Ach so,
    ja die Ausgaben sind direkt in der HookProc,
    und hier bekomme ich eben nur die WM_KEYUP.



  • Aziz schrieb:

    static LRESULT CALLBACK LLKeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      //if (nCode < 0)
      //  return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
    

    Warum sind diese beiden Zeilen auskommentiert?

    Die Platform-SDK Doku sagt dazu:

    nCode
    [in] Specifies a code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx.



  • der keyboardhook gehoert in 'ne dll und nicht in das haupprog.



  • ich_ich schrieb:

    der keyboardhook gehoert in 'ne dll und nicht in das haupprog.

    Der Keyboardhook ist selbstverständlich in einer dll!!


Anmelden zum Antworten