一尘不染

保持窗口顶部,并在WinForms中抢占焦点

c#

我意识到,在正常情况下,这是完全不正确的做法,但这仅适用于需要从条形码扫描仪(模拟键盘)获取输入的测试应用。问题是我需要在扫描时启动一些脚本,因此在单击脚本以运行它之后,我需要窗口来重新获得焦点。我试过使用Activate(),BringToFront(),Focus()以及一些Win32调用,例如SetForegroundWindow(),Setcapture()和SetActiveWindow()…但是,我能做的最好的就是使任务栏项开始闪烁以告诉我它
获得焦点,但是有一些正在停止。顺便说一句,我正在XP SP2上运行此程序,并使用.NET 2.0。

这可能吗?

编辑:澄清一下,我通过在资源管理器中双击脚本来运行它们。因此,我需要它来将精力从浏览器转移回测试应用程序。


阅读 251

收藏
2020-05-19

共1个答案

一尘不染

能见度

使该窗口成为“最热门”窗口。这是任务管理器可以保留在其他窗口之上的方式。这是a的属性,Form您可以通过将值设置为来使表单最顶部(在其他窗口上方浮动)
true

您无需使用最顶层的设置覆盖任何“活动窗口”行为。

焦点

之前在StackOverflow上问过类似的问题,答案可以解决您的问题。您可以使应用程序使用低级输入挂钩,并获取来自扫描仪的键控代码的通知。这样,即使应用程序没有焦点,您的应用程序也总是获得这些键。

您可能需要增强解决方案来压缩键控代码,以使它们不会传输到“焦点对准”的应用程序(例如记事本)。

从Windows 2000开始,没有用户直接干预的正式机制,应用程序就无法抓住焦点。通过RawInputDevices挂钩查看输入流是唯一明智的方法。

许多文章可能会有所帮助(C#实现)

2020-05-19