Windows 8 .net焦点问题form.activate在使用调试器运行时具有不同的行为

时间:2015-03-09 23:08:59

标签: vb.net debugging windows-8 focus microsoft-metro

我已经为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按钮按键,但这还有其他问题。

1 个答案:

答案 0 :(得分:0)

Windows专门尝试阻止应用程序从其他应用程序窃取前景。请参阅SetForegroundWindow文档以获取有关此问题的评论以及可使应用程序出现在前台的因素(您尝试的所有方法基本上都归结为SetForegroundWindow调用)。

请注意,其中一个显式阻止情况是“前台进程不是现代应用程序或开始屏幕。”

这在调试时适用于您,因为“正在调试进程”是明确允许前台权限的情况之一。

因为这通常是用户不友好的事情,所以没有一个好的通用方法来绕过这种行为并窃取前景。

同样,普通应用无法在现代应用程序或开始屏幕上运行。

通过调用LockWorkStation函数锁定系统可能会更好。