寻找有关在Win7中定位挂钩的指导,以确定监视器是连接还是断开连接

问题描述 投票:0回答:1

在医疗保健环境中,将大量Win7视频设备分布在多个不同位置。有时需求是可怕的,他们会立即被使用。每个设备通过HDMI连接到壁挂式电视。一个痛点是,有时人们会断开HDMI线缆与Win7计算机的连接,以插入违反政策的个人设备。当设备需要下次使用时,它们不会重新连接导致问题的电缆。它导致了护理延误。在过去的一周里,我一直在努力编写一个小应用程序(最好是系统级别的服务),它将检测显示器何时不再连接到PC然后触发操作(例如,EventLog条目,发送电子邮件警报等)。不幸的是,我的所有尝试都遇到了障碍。寻找想法。

我花了很多时间研究我可以在Windows中表现出来的方法或“钩子”,我可以触发它。我发现有可能有助于这项工作的本机类(DeviceWatcher,WindowsDeviceEnumeration等),但不幸的是它们不兼容Win7。 我确实使用SystemEvents.DisplaySettingsChanging的事件处理程序创建了一个c#控制台应用程序,这正是我想要的!我可以断开显示器的连接,它会发送一个警报电子邮件并写一个事件日志条目(我们可以使用第三方工具和警报监控,创建票证等)。虽然这个控制台应用程序运行良好,但我需要它作为隐藏的后台服务更多地工作。我创建了一个具有相同功能的Windows服务,但我发现事件处理程序在Windows服务中可能很棘手。在Windows服务模式下,我永远无法触发EventHandler(SystemEvents_DisplaySettingsChanging)。我发现EventHandler DisplaySettingsChanged是一个用户级事件,只能作为当前用户使用,而不是作为服务运行时的系统级别。 我已经测试了各种拔出监视器的方法,并寻找窗口报告“无监视器”的方法。我已经尝试过WIn32_PnPEntity类以及Win32_Video *类,他们都会报告监视器状态正常,即使它不是连接的。

我确实发现我可以在断开监视器时看到设备管理器,并看到监视器从监视器选项卡中消失。我可以通过某种方式加入这个问题。 我想我可以运行一个带有计时器的Windows服务来检查这个钩子。如果监视器已连接,则不执行任何操作 - 如果未连接,请执行操作(发送警报,写入事件日志条目,创建故障单等)

最终我希望有一个带有计时器的Windows服务,它将在系统模式下运行,基本上重新运行这样的检查:如果监视器已连接,则不执行任何操作。 如果没有连接监视器,发送警报,创建故障单,创建事件日志条目等。

我花了很多时间在这上面,我必须提出3/28的调查结果。

任何帮助赞赏。谢谢!

c# powershell winapi monitoring
1个回答
0
投票

我探索了WM_DEVICECHANGE和WM_DISPLAYCHANGE,但我无法按照我的需要工作,而且我的时间已经不多了。 我将来需要更多时间来解决这些问题(以及一般性地捕获Windows消息)。 但是,我终于能够找到合适的钩子来实现我的目标。

我遇到的挑战是,无论我用什么类或组件检测显示器连接,我总是返回至少一个显示器,即使它是物理断开的。

在PowerShell中修改,我发现使用WMI和Win32_PnPEntity,我可以提取显示信息,如果没有显示连接,DeviceID将始终返回Display \ NVD0000 \ SomeGuid。当连接1或2个监视器时,DeviceID将是一个十六进制变体,在NVD之后替换零(例如Display \ NVD39E4 \ someGUID)。

知道我可以指望在没有连接监视器的情况下获取Display \ NVD0000的deviceID我使用ManagementObjectSearcher和Win32_PnPEntity构建了一个带有计时器的Windows服务。计时器每10分钟运行一次,然后执行检查。 如果找不到物理连接的显示,它将触发事件日志条目,可以使用外部监视工具(Xymon,Nagios等)监视,并且可以采取警报/操作以确保它得到纠正。

我用HDMI显示器测试过。监视器在电源关闭情况下进行测试,监视器源更改为另一个输入条件(非HDMI),我可以触发警报的唯一情况是当电缆与PC物理断开时,这正是我想要的。

不仅仅是一种给猫皮肤的方法。我知道还有其他开发人员可以在几分钟内将一个精心设计的工作解决方案混合在一起。考虑到C#在我职业生涯中累计屏幕时间的数量(相对来说不是很多),我对这个小小的胜利感觉很好。

希望这有助于将来的某些人。

© www.soinside.com 2019 - 2024. All rights reserved.