Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 捕获WM_设备更改_C_Windows_Winapi_Gcc_Mingw - Fatal编程技术网

C 捕获WM_设备更改

C 捕获WM_设备更改,c,windows,winapi,gcc,mingw,C,Windows,Winapi,Gcc,Mingw,如何意识到WM_设备更改的到来 WndProc被覆盖。我捕获了所有消息,但没有一条属于WM\u DEVICECHANGE类型RegisterDeviceNotification使链接器抱怨找不到该函数!所以我被困在巫术中。请帮忙 旁白:当然,我已经用谷歌搜索和堆垛溢出(lol)了大约8个小时 int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdSho

如何意识到WM_设备更改的到来

WndProc
被覆盖。我捕获了所有消息,但没有一条属于
WM\u DEVICECHANGE
类型
RegisterDeviceNotification
使链接器抱怨找不到该函数!所以我被困在巫术中。请帮忙

旁白:当然,我已经用谷歌搜索和堆垛溢出(lol)了大约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\u wnd\u pro
c被执行,但从未在它应该执行的时候执行(当然是在设备更改时,我清楚吗?

问题是您正在创建一个不接收广播的:

“仅限消息”窗口允许您发送和接收消息。它不可见,没有z顺序,无法枚举,不接收广播消息。窗口只是发送消息

因此,您不能使用仅显示消息的窗口,而是需要创建一个从未显示的顶级窗口。这很容易实现-停止将
HWND\u消息传递到
CreateWindow
并确保从不调用
ShowWindow


作为一个旁白,<代码>睡眠(1000)< /代码>在消息循环的中间将是一场灾难。你需要及时传达信息,而不是在工作中睡着。你必须摆脱那种睡眠状态。请注意,如果队列为空,则

GetMessage
将被阻塞,因此您无需担心应用程序正在热运行

您的消息循环应如下所示:

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
} 

我认为描述不清楚。如果可能的话,请重新构造并展示一些代码。为什么您尝试自己编写样板代码,而不是使用一个广泛分发的示例?这就是用“lol”作为前缀的问题。即使是操作系统也不会把你当回事。英雄联盟