如何了解WM_DEVICECHANGE
到达?
WndProc
已被覆盖。我捕获了大量的消息,但没有一个是WM_DEVICECHANGE
类型。 RegisterDeviceNotification
使链接器抱怨它无法找到该函数!所以我陷入了这种伏都教魔法。请帮助。
P.S。:当然我一直在谷歌搜索和堆栈溢出(大声笑)所有这些东西大约8小时。
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
LPTSTR lolclassname = "lolclass";
WNDCLASS lolclass;
HWND lolwindow;
MSG lolmsg;
UINT msgstatus;
lolclass.style = CS_VREDRAW;
lolclass.lpfnWndProc = &lol_wnd_proc;
lolclass.cbClsExtra = 0;
lolclass.cbWndExtra = 0;
lolclass.hInstance = hInstance;
lolclass.hIcon = NULL;
lolclass.hCursor = NULL;
lolclass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
lolclass.lpszMenuName = NULL;
lolclass.lpszClassName = lolclassname;
if(!RegisterClass(&lolclass)) fail("RegisterClassEx");
lolwindow = CreateWindow("lolclass", NULL, WS_MINIMIZE, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
HWND_MESSAGE, NULL, hInstance, NULL);
if(lolwindow == NULL) fail("CreateWindowEx");
/*ShowWindow(lolwindow, nCmdShow);
UpdateWindow(lolwindow);*/
do {
/* if(!SetWindowPos(lolwindow, HWND_TOPMOST, 1, 1, 1, 1,
SWP_HIDEWINDOW))
fail("SetWindowPos");*/
msgstatus = GetMessage(&lolmsg, lolwindow, 0, 0);
if(!msgstatus) break;
if(msgstatus == - 1) fail("GetMessage");
TranslateMessage(&lolmsg);
DispatchMessage(&lolmsg);
Sleep(1000);
} while(1);
return lolmsg.wParam;
}
lol_wnd_pro
c已执行但从未发生过(当然,设备更改时,我是否清楚?)
答案 0 :(得分:4)
问题是您正在创建一个不接收广播的message-only window:
仅限消息窗口可让您发送和接收消息。它不可见,没有z顺序,无法枚举,不接收广播消息。该窗口只是发送消息。
因此,您不能使用仅限消息的窗口,而是需要创建一个从未显示的顶级窗口。实现这一点很简单 - 停止将HWND_MESSAGE
传递给CreateWindow
并确保您永远不会致电ShowWindow
。
顺便说一下,消息循环中间的Sleep(1000)
将是一场灾难。您需要及时提取信息,而不是在工作中入睡。你必须摆脱Sleep
。请注意,如果队列为空,GetMessage
将阻止,因此您无需担心应用程序正在运行。
您的消息循环应如下所示:
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}