检测在Windows 7下连接或删除的外部显示器

时间:2011-05-12 16:47:43

标签: winapi events notifications external-display hotplugging

每次插入外接LCD显示器或从运行Windows 7的笔记本电脑上拔下插头时,是否会收到或挂断某些事件或通知?

笔记本电脑检测到这种情况并将我的显示切换到外部屏幕并返回某些类型的调整大小或重新定位,但这是否由操作系统公开,以便应用程序可以提供处理程序,附加脚本等?

如果没有,是否有我可以不时轮询的注册表设置或API?

(我更喜欢编程C + Win32 API)

更新

迈克在下面给出了答案,WM_DEVICECHANGE让我RegisterDeviceNotification(),但到目前为止我一直在努力实施......

更新2

这个问题已被问过几次不同的措辞,但在我看来还没有完全回答:

3 个答案:

答案 0 :(得分:4)

根据this article,Windows会在显示分辨率更改时以及添加或删除显示时发送WM_DISPLAYCHANGE消息。

如果由于添加或删除监视器而需要对桌面大小更改做出反应,则可以在此消息的处理程序中执行此操作。 LPARAM为您提供窗口所在显示的新分辨率。请注意,如果您使用100%以外的系统DPI缩放而且您的程序不是DPI-aware,则此分辨率将被缩放。

或者使用EnumDisplayMonitors功能获取每个连接的显示器的显示分辨率以及虚拟桌面中显示器的相对位置。无论DPI缩放如何,此函数都使用实际设备像素值。

答案 1 :(得分:3)

您可以尝试WM_DEVICECHANGE。如果这不起作用,运行你的窗口并将Spy ++附加到它,它将记录它收到的所有窗口消息。然后插入显示器并检查是否收到任何消息。

或者,您可以使用SM_CMONITORS轮询GetSystemMetrics()

答案 2 :(得分:0)

如上所述here

您将看到已注册的消息" UxdDisplayChangeMes​​sage"和" HotplugDetected" (仅在添加监视器时第二个)。您可以使用RegisterWindowMessage获取这些消息的标识符。

您还可以查看其他消息,只需查看链接的答案。