WM_INPUT über Hook Funktion empfangen



  • Ich muss in meine MFC Applikation einen Hook erstellen um die WM_INPUT Nachrichten zu erhalten. Ich brauche es um verschidene HIM Geräte zuerkennen. Dazu habe eine kleine Test App erstellt und versuche es zu verstehen.
    Wenn ich eine einfache WIN32 App erstelle und folgendes einfüge:

       RAWINPUTDEVICE Rid[1];
       Rid[0].usUsagePage = 1; //HID_USAGE_PAGE_GENERIC;
       Rid[0].usUsage = 2;  // HID_USAGE_GENERIC_MOUSE;
       Rid[0].dwFlags = 0;// RIDEV_INPUTSINK;
       Rid[0].hwndTarget = 0;
       RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
    

    und in der Queue Auswertung einpflege:

      while (GetMessage(&msg, nullptr, 0, 0))
      {
          if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
          {
              if (msg.message == WM_INPUT)
              {
                 cnt++;   // Zähler wird hochgesetzt (Alles OK)
              }
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
    }
    

    dann erhalte ich meine gewünschte Nachricht.

    Das gleiche möchte ich aber mit eine Hook Funktion abfangen. Also setzte ich noch:

      DWORD dw;
      HHOOK g_hook;
      g_hook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hInstance, GetCurrentThreadId());
      if (g_hook == NULL)
      {
    	dw = GetLastError();
      }
    

    nach dem RegisterRawInputDevices Aufruf.

    Mit der Callback Funktion würde ich gerne ebenfalls diese Nachricht erhalten:

    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      if (nCode >= HC_ACTION)
      {
            const LPCWPSTRUCT lpcwprs = (LPCWPSTRUCT)lParam;
    
      	if (lpcwprs->message == WM_INPUT)
           	{
    	   cnt++; // Zähler wird nicht hochgesetzt 
            }
       }
       return CallNextHookEx(g_hook, nCode, wParam, lParam);
    }
    

    Was fehlt mir noch bzw. mache ich falsch?

    LG



  • Hallo,

    so wie ich die Kommentare in Can I use Global Hooks and Raw Input at the same time? richtig verstehe, entspricht ein RegisterRawInputDevices-Aufruf schon intern einem globalen Hook (der dann eben eine WM_INPUT-Nachricht erzeugt), also "entweder oder".
    Zusammen fängt der interne Hook schon den "raw input" ab und verschickt die Nachricht, so daß dann kein CallNextHookEx(...) erfolgt und damit dein globaler Hook nicht mehr aufgerufen wird.


Log in to reply