捕捉 WM_DEVICECHANGE

gla*_*ing 4 c windows winapi gcc mingw

如何觉知WM_DEVICECHANGE到达?

WndProc被覆盖了。我收到了一大堆消息,但没有一个是 type WM_DEVICECHANGERegisterDeviceNotification使链接器抱怨它找不到该函数!所以我被困在这个巫毒魔法中。请帮忙。

PS:当然,我一直在谷歌搜索和计算器溢出(笑)所有这些东西大约 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;
}
Run Code Online (Sandbox Code Playgroud)

lol_wnd_proc 被执行,但从未在它应该执行的时候执行(当然,在设备更改时,我清楚吗?)

Dav*_*nan 5

问题是您正在创建一个不接收广播的仅消息窗口

仅消息窗口使您能够发送和接收消息。它不可见,没有 z-order,无法枚举,并且不接收广播消息。窗口只是发送消息。

因此,您不能使用仅消息窗口,而需要创建一个永远不会显示的顶级窗口。这很容易实现——停止传递HWND_MESSAGECreateWindow并确保你永远不会调用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); 
    }
} 
Run Code Online (Sandbox Code Playgroud)