如何设置一个系统范围的挂钩以收听WM_DeviceChange

How do I setup a systemwide hook to listen for WM_DEVICECHANGE?

本文关键字:WM DeviceChange 系统 设置 何设置 一个 范围      更新时间:2023-10-16

我想设置一个系统宽钩以在C 中收听WM_DEVICECHANGE。我知道使用SetWindowsHookEx()设置钩子。我以前已经为键盘消息(WM_KEYUPWM_KEYDOWN)这样做,但是我想为WM_DEVICECHANGE做到这一点。我目前正在使用:

#include <windows.h>
#include <tchar.h>
#include <iostream>
void WinHook();
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
int _tmain(int argc, _TCHAR* argv[])
{
   WinHook();
   std::cout << GetLastError() << " winhookn";
   return 0;
}
void WinHook()
{
   HHOOK hook = NULL;
   hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, NULL, GetCurrentThreadId());
   std::cout << GetLastError() << " sethookn";
   MSG msg;
   while (GetMessage(&msg, NULL, 0, 0) > 0)
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
}
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam){
   std::cout << GetLastError() << " hookproc calledn";
   switch (wParam){
     case WM_DEVICECHANGE: std::cout << "SUCCESS!!!!!"; break;
     default: return CallNextHookEx(NULL, nCode, wParam, lParam);
   }
}

编辑:SetWindowsHookEx()后的GetLasterror()返回0,并且函数HookProc()中的一个从未被调用。

您正在为您的线程接收的所有消息安装一个窗口镜。

您的程序不会打开任何窗口,它不会收到任何消息。因此,挂钩不会被调用。

正如您需要创建(也许是隐藏的)顶级窗口和RegisterDeviceNotification所述的一篇评论中所述,您不需要挂钩。

另一种方法是安装系统宽挂钩,但这需要额外的DLL和桌面上的任何其他顶级窗口,并且更复杂且资源更多。

尝试使用钩子是一个错误。

正确的方法是使用窗口接收消息。如果您手头有一个,也许是顶级窗口。或仅消息窗口。顶级窗口将接收基本通知。或将RegisterDeviceNotification与仅有消息窗口一起接收更全面的通知。