gpt4 book ai didi

c++ - 如何检测新监视器的添加?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:52 26 4
gpt4 key购买 nike

我有一个处理一些窗口管理热键的无窗口程序。我想提供一些功能,例如在显示器之间移动窗口的能力。我用过 EnumDisplayMonitors枚举系统中所有现有的监视器,我已经编写了代码来处理 WM_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();
}
}

程序可以正常编译和运行,并且热键可以使用。但是,在添加或删除监视器后,什么也没有发生。指示已收到消息的消息框永远不会出现。

我想我可以每 5 秒轮询一次监视器配置,但这不是解决问题的正确方法。

我是否需要实际创建一个窗口来接收 WM_DEVICECHANGE?因为我没有。热键在触发时将它们的消息发布到 NULL,因为它们没有绑定(bind)到窗口,由主线程处理。

最佳答案

您必须创建一个窗 Eloquent 能获取 WM_DEVICECHANGE消息。

WM_DEVICECHANGE 是广播的消息,SendMessage(HWND_BROADCAST,...)风格。只有顶级窗口可以接收它。窗口不需要可见,因此没有理由寻找替代方案。

RegisterDeviceNotification()是另一种选择。但这仍然需要一个窗口。或服务句柄,但您不想从服务中移动窗口。他们使用自己的桌面在隔离的 session 中运行。所以创建一个窗口是一个硬性要求。

关于c++ - 如何检测新监视器的添加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16841096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com