我已经为Windows平板电脑设备编写了一个WinForms驱动程序安全应用程序,当它检测到汽车正以超过15公里/小时的速度移动时,将屏幕空白(显示全屏空白的最顶层窗口)(使用平板电脑GPS) )。
该软件在Windows 7下运行良好,但我在Windows 8下工作有点困难。我的第一个挑战是当前显示Metro开始菜单时显示空白屏幕。因此,如果用户显示Metro开始菜单并且汽车开始移动>我的空白屏幕应该显示15公里/小时...我需要从地铁界面窃取焦点并在桌面上显示我的空白窗口。
为了测试这个,我在2010年写了一个简单的vb.net应用程序。它有一个定时器每隔3秒触发一次。在Tick事件中,我有代码:
Beep()
Me.Activate()
当我使用调试器运行它并按下Windows键以显示Metro Start Menu时,它工作...焦点切换回桌面(和我的窗口)。但是,当我在没有调试器的情况下运行它并执行相同的操作时,我可以听到哔哔声,但焦点从未切换回桌面。
为什么行为会有所不同?关于如何复制附加调试器时所获得的相同行为的任何想法?
我尝试了一些像AppActivate这样的东西,设置了TopMost,BringToFront这个形式,但遗憾的是这没有用。
我提出的唯一解决方案是发送一个Windows按钮按键,但这还有其他问题。
答案 0 :(得分:0)
Windows专门尝试阻止应用程序从其他应用程序窃取前景。请参阅SetForegroundWindow文档以获取有关此问题的评论以及可使应用程序出现在前台的因素(您尝试的所有方法基本上都归结为SetForegroundWindow调用)。
请注意,其中一个显式阻止情况是“前台进程不是现代应用程序或开始屏幕。”
这在调试时适用于您,因为“正在调试进程”是明确允许前台权限的情况之一。
因为这通常是用户不友好的事情,所以没有一个好的通用方法来绕过这种行为并窃取前景。
同样,普通应用无法在现代应用程序或开始屏幕上运行。
通过调用LockWorkStation函数锁定系统可能会更好。