c# - 当我将 visible 正确设置为 true 时,如何防止我的 C# winforms 应用程序窃取焦点?

标签 c# winforms focus visible

我有一个在后台运行的 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/

相关文章:

javascript - AJAX post 请求报告失败,但实际上成功

c# - 理解正确的 http keep-alive 实现

c# - Xamarin Forms 的本地通知?

c# - 在 Windows 窗体中选择和更新数据表

android - 有没有一种有效的方法来进行 "continuous"自动对焦?

c# - Microsoft图表控件无法设置背景透明

c# - ThreadPool 设置是全局设置还是仅针对工作项?

c# - 如何更改 Windows 控件的 `All Desired` 属性?

数据网格中的 WPF 弹出焦点

javascript - 如何知道焦点何时在 react native textInput 中丢失?