C++ 如何检测新显示器的添加?

C++ 如何检测新显示器的添加?,c++,winapi,windows-messages,C++,Winapi,Windows Messages,我有一个无窗口程序,可以处理一些窗口管理热键。我想提供一些功能,比如能够在监视器之间移动窗口。我曾经枚举过系统中所有现有的监视器,并且编写了处理WM\u DEVICECHANGE的代码,但实际上我没有收到消息 这是我的消息循环: // I've tried GetMessage(&msg, (HWND) NULL, 0, 0) here too while (GetMessage(&msg, (HWND) -1, 0, 0) > 0) { int key;

我有一个无窗口程序,可以处理一些窗口管理热键。我想提供一些功能,比如能够在监视器之间移动窗口。我曾经枚举过系统中所有现有的监视器,并且编写了处理
WM\u DEVICECHANGE
的代码,但实际上我没有收到消息

这是我的消息循环:

// I've tried GetMessage(&msg, (HWND) NULL, 0, 0) here too
while (GetMessage(&msg, (HWND) -1, 0, 0) > 0)
{
    int key;
    int mod;

    MessageBox(NULL, (LPCWSTR) ((std::wostringstream&) (std::wostringstream() << L"You got a message: " << msg.message)).str().c_str(), L"Got Message", MB_OK);

    switch (msg.message)
    {
    case WM_HOTKEY:
        key = HIWORD(msg.lParam);
        mod = LOWORD(msg.lParam);

        if (mod != MOD_WIN) continue;
        ProcessHotkey(key);
        break;
    case WM_DEVICECHANGE:
        InitMonitorInfo();
    }
}
//我也在这里尝试了GetMessage(&msg,(HWND)NULL,0,0)
while(GetMessage(&msg,(HWND)-1,0,0)>0)
{
int键;
整数模;

MessageBox(NULL,(LPCWSTR)((std::wostringstream&)(std::wostringstream())必须创建一个窗口来获取消息

WM_DEVICECHANGE
是一种广播式消息。只有顶级窗口才能接收它。该窗口不需要可见,因此没有理由寻找替代方案


是另一种选择。但这仍然需要一个窗口。或一个服务句柄,但您不想从服务中移动窗口。它们在一个独立的会话中运行,有自己的桌面。因此,创建一个窗口是一个很难的要求。

注册设备更改消息:我看到,在我查看时,我必须传递一个实际的HWND或w吗它是否接受NULL并将消息发布到线程?听起来可能需要一个窗口句柄。当我这样做时,我使用了一个隐藏窗口。因此,您可能必须创建窗口,将消息循环更改为“GetMessage,TranslateMessage,DispatchMessage”,然后在WinProc函数中处理WM_DEVICECHANGE。您确实需要一个窗口。您可以使用样式
WS_EX_noactive
WS_DISABLED
创建一个不显示的窗口。