WH_KEYBOARD_LL挂钩在UMDF驱动程序中未调用,但在示例控制台应用程序中有效

问题描述

我试图通过注册WH_KEYBOARD_LL和WH_MOUSE_LL挂钩来检测所有按键和鼠标事件。显然,这些低级挂钩不需要挂钩过程驻留在单独的DLL中。

我在以下示例应用程序(控制台应用程序)中进行此工作。

#include <iostream>
#include <Windows.h>
#include <Winuser.h>
#include <thread>
#include <chrono>
#include <sstream>
#include <atomic>
#include <cassert>

LRESULT CALLBACK wndProc(HWND hWnd,UINT message,WParaM wParam,LParaM lParam)
{
  std::cout << std::endl << "EVENT: " << hWnd << "," << message << "," << wParam << "," << lParam << std::endl;
  return 0;
}

LRESULT CALLBACK keyboardHook(
  _In_ int    nCode,_In_ WParaM wParam,_In_ LParaM lParam
)
{
  std::cout << "Keyboard: " << nCode << "," << lParam << std::endl;
  return CallNextHookEx(NULL,nCode,wParam,lParam);
}

LRESULT CALLBACK mouseHook(
  _In_ int    nCode,_In_ LParaM lParam
)
{
  std::cout << "Mouse: " << nCode << ",lParam);
}

int main()
{
  const wchar_t pszClassName[] = L"MyMessageWindow";
  auto hInstance = GetModuleHandle(NULL);

  WNDCLASSEXW wcl;
  ZeroMemory(&wcl,sizeof(WNDCLASSEXW));

  wcl.cbSize = sizeof(WNDCLASSEXW);
  wcl.hInstance = hInstance;
  wcl.lpszClassName = pszClassName;
  wcl.lpfnWndProc = wndProc;

  assert(RegisterClassExW(&wcl) != 0);

  auto hwnd = CreateWindowW(
    pszClassName,pszClassName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,HWND_MESSAGE,NULL,NULL
  );

  auto threadId = 0;

  std::thread t([hwnd,threadId]() {
    auto keyboardHookHandle = SetwindowsHookEx(WH_KEYBOARD_LL,keyboardHook,threadId);
    auto mouseHookHandle = SetwindowsHookEx(WH_MOUSE_LL,mouseHook,threadId);

    while (true) {
      MSG msg;
      GetMessage(&msg,hwnd,0);
    }
  });

  t.join();

  return 0;
}

所以这行得通,而且无论焦点对准了哪些应用程序,我都可以看到打印到控制台的键盘和鼠标事件,这很棒。

但是,当我在UMDF驱动程序中执行此操作时,消息不会通过。对SetwindowsHookEx的调用似乎成功,没有错误

我正在考虑创建一个最小的UMDF驱动程序来测试是否可能,但是我想先问一下这里,以防有人可以告诉我是否可能。如果没有,我会想到其他几种方法

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)