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

hip*_*ail 8 events winapi notifications external-display hotplugging

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

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

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

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

UPDATE

迈克在下面的回答WM_DEVICECHANGE引导我RegisterDeviceNotification(),但到目前为止,我正在努力实施它......

更新2

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

小智 6

根据这篇文章WM_DISPLAYCHANGE当显示分辨率发生变化以及添加或删除显示器时,Windows 会发送消息。

如果您需要对由于监视器添加或删除而导致的桌面大小变化做出反应,您可以在此消息的处理程序中执行此操作。将LPARAM让你在位于窗口显示的新决议。请注意,如果您使用 100% 以外的任何其他值进行系统 DPI 缩放并且您的程序不支持DPI,则此分辨率将被缩放。

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

  • 我刚刚通过添加和删除监视器测试了“WM_DISPLAYCHANGE”,它在 Windows 10 上运行良好(尽管最初的问题是关于 Windows 7)。 (2认同)

Mik*_*wan 3

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

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

  • 这是一个非常古老的答案,但无论如何我都会发表评论 - 你可以只听这条消息来指示发生了什么变化,然后使用 EnumDisplayMonitors (或类似的东西,它不是这项工作的唯一工具)来循环每个可用的监视器。 (2认同)

归档时间:

查看次数:

9647 次

最近记录:

10 年,1 月 前