如何检测添加的新监视器
How do I detect the addition of a new monitor?
我有一个处理一些窗口管理热键的无窗口程序。我希望提供一些功能,比如在监视器之间移动窗口的能力。我已经使用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
当他们触发,因为他们没有绑定到一个窗口,由主线程处理。您必须创建一个窗口来获取WM_DEVICECHANGE
消息。
WM_DEVICECHANGE
是一个广播的消息,SendMessage(HWND_BROADCAST,...)
样式。只有顶级窗口可以接收它。这个窗口不需要是可见的,所以没有什么理由去寻找替代方案。
RegisterDeviceNotification()
是另一种选择。但这仍需要一个窗口期。或者一个服务句柄,但是你不想从一个服务中移动窗口。它们与自己的桌面运行在一个独立的会话中。所以创建一个窗口是一个硬性要求。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 将QIcon添加到QTableView单元格
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 将图像添加到资源文件夹UWP C++
- 如何检测添加的新监视器