背景:
我需要在另一台显示器上创建调光效果。我想我通过使用 WPF 窗口解决了这个问题,该窗口占据了整个屏幕尺寸Topmost
and AllowsTransparency
= 正确。它具有内部黑色发光效果并具有风格WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW
应用于它(除其他外)以允许用户单击其背后的应用程序。
我监控EVENT_OBJECT_REORDER
Windows 中的事件和调用SetWindowPos
强制最顶层状态位于其他最顶层窗口之上。到目前为止,它在我的概念验证测试中似乎运行良好。
我发现的问题是这个变暗(窗口)会覆盖任务栏,但如果我单击“开始”菜单则不会。我目前正在使用 Windows 10 进行测试。如果我单击“开始”菜单,它会导致“开始”菜单和任务栏出现在变暗(窗口)上方。我希望一切都保持昏暗,永远。
我通过设置解决了这个问题uiAccess
=true 在应用程序清单中,生成自签名证书,并将 exe 复制到“c:\program files*”。这允许我强制窗口处于最顶层状态,甚至位于“开始”菜单上方。
我的问题:
有没有办法将窗口定位在“开始”菜单上而不需要uiAccess
?或者甚至是另一种在不使用窗口的情况下强制屏幕变暗的方法(但不依赖于显示器驱动程序或硬件功能)?
如果没有,在分发 WPF 应用程序(通过 WiX 安装项目或类似项目)以绕过 UIPI 限制时,我需要牢记哪些注意事项uiAccess
=真的吗?我可以在设置过程中简单地安装我的自签名证书吗?用户会遇到任何额外的障碍吗?作为一名开发人员,我在构建此项目时是否会遇到任何其他障碍(除了我已经提到的之外)?
谢谢你!
我监视 EVENT_OBJECT_REORDER 事件
您正在使用 SetWinEventHook()。这个场景失败了经典的“如果two程序就是这样做的”括号。Raymond Chen 在这篇博文 https://blogs.msdn.microsoft.com/oldnewthing/20050607-00/?p=35413,给你的方法一个专职岗位 https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253.
这比您想象的要常见得多。每台 Windows 机器都有一个执行此操作的程序,例如运行Osk.exe
,屏幕键盘程序。有趣的实验,我预测它会严重闪烁一段时间,但假设它最终会放弃。实际上不确定它是否有效,上次我尝试此操作是在 Vista 时间,但它不会,请告诉我们。
相当肯定您会得出结论,这不是正确的方法,因此 uiAccess 也没有实际意义。您需要它来绕过 UIPI 并使 SetWindowPos() 工作。 UAC 的一个方面,阻止程序尝试劫持提升的程序的功能。覆盖“开始”窗口相当于 DOS 攻击。这里更大的问题是你的自签名证书不起作用,你必须购买一个真正的证书。每约 7 年就会让您损失数百美元。
使用软件控制显示器亮度并不容易正确完成。每个人都使用 SetDeviceGammaRamp(),这也是您应该做的。 MSDN 文档会给您带来很多 FUD,但据我所知,每个主流视频适配器驱动程序都实现了它。它在游戏中很流行。一个不可避免的限制是它仅对运行程序的桌面有效。因此不适用于安全桌面(屏幕保护程序和 Ctrl+Alt+Del),也不适用于其他登录会话,除非它们也启动您的程序。
WMI 太不稳定,无法考虑。不太确定为什么它经常失败,我认为这与视频适配器和显示器之间通常不太理想的 I2C 互连有关。或者想要通过 Fn 按键控制亮度的笔记本电脑,该功能总是胜出。或者 Windows 功能可以根据环境光自动调整亮度,这总是更理想的方法,但很难遵循。
最常见的结果可能是用户对你的程序不屑一顾,并对笨拙的显示器控件大加咒骂。但他会摆弄它并找出答案。对不起。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)