我有一个在后台运行的 C# winforms 应用程序,监听要按下的热键。当按下热键时,我的表单会短暂出现。该窗体始终在运行,但设置为隐藏,直到我收到一个热键事件,此时我将可见属性设置为 true。代码如下所示:
void hook_volumeDown(object sender, KeyPressedEventArgs e)
{
this.Visible = true;
}
需要注意的是,这个表单最顶层的属性设置为true。
真正奇怪的是,在我的 C# 应用程序从另一个应用程序窃取焦点后,它再也不会这样做了。例如:我启动我的应用程序,然后启动一些全屏应用程序,如军团要塞 2。然后我按下热键。军团要塞 2 最小化,我看到了我的表格。然而,然后,我可以恢复 TF2,并再次按下我的热键(达到预期的效果),TF2 将保持专注。
无论如何,我正在寻找解决此问题的方法。我在这里发现了很多涉及类似问题的问题,但所有问题都与创建/启动新表单有关,而不是使现有表单可见(除非我错过了什么)。我可以重新设计应用程序以在每次需要时创建一个新表单,但这将需要创建另一个一直不可见的表单,只是为了等待热键事件,所以我宁愿保持原样。
有什么想法吗?
最佳答案
我认为您的问题与 Visible = true 在第一次调用和后续调用之间的行为不同这一事实有关。第一次调用 visible 并且尚未创建窗口句柄时,将通过调用 CreateWindowEx 创建窗口,该窗口具有一些控制窗口行为方式的样式参数。我认为您需要确保使用 WS_EX_NOACTIVATE 样式创建窗口,您可以通过重写 CreateParams 来实现。
其他要尝试的事情:
1) 如果程序提供 STARTUPINFO 结构,ShowWindow 函数(由 Visible = true 使用)在第一次调用时忽略焦点参数 ( http://msdn.microsoft.com/en-us/library/ms633548%28VS.85%29.aspx )。深入研究反射器并找出 Form 类是否提供了 STARTUPINFO 结构,如果是,如何操作它。
2) Form 有一个 ShowWithoutActivation 属性,可以覆盖并设置为 true,你覆盖了吗?
很抱歉“没有确切答案”,但我希望这至少能为您提供一些进一步调查的起点。祝你好运。
关于c# - 当我将 visible 正确设置为 true 时,如何防止我的 C# winforms 应用程序窃取焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838834/