模式对话框没有';无法集中注意力

本文关键字:集中 注意力 对话框 模式 | 更新日期: 2023-09-27 18:29:19

我正在处理一个与C#WinForms应用程序有关的错误,该应用程序以启动屏幕启动,然后关闭启动屏幕并打开登录表单。在某些计算机上,一切都很正常。在其他网站上,登录表单会出现,但标题栏会闪烁,闪烁几下后,就会完全失去焦点。光标仍然在"用户名"文本框中闪烁,但应用程序没有焦点,当你开始打字时,什么都没有发生,这对用户来说非常烦人。

运行的操作系统似乎没有什么区别(我们已经尝试过Windows 7和Server 2008),并且我们特别注意在启动应用程序后没有任何键盘或鼠标输入。

现在,有人知道是什么导致应用程序失去焦点吗
或者,您将如何调试此问题?我们一直无法在Visual Studio调试环境中复制这个问题,但这并不完全让我感到惊讶,因为我想这是一个编译后的应用程序如何与操作系统交互的问题。。。还是我错了?

编辑#1:我以为@vinodpthmn解决了这个问题,确保在登录表单出现之前正确关闭启动屏幕,但这似乎没有帮助。因此,我创建了一个记录器来跟踪所有事件和线程,并发现了以下有趣的日志条目:

Thread 01 - 2012/03/29 12:51:09.693 - Show splash screen
Thread 01 - 2012/03/29 12:51:20.350 - Splash screen closed
Thread 01 - 2012/03/29 12:51:20.490 - Login Form Activated
Thread 01 - 2012/03/29 12:51:20.522 - Login Form Load
Thread 01 - 2012/03/29 12:51:25.694 - Login Form deactivated
Thread 01 - 2012/03/29 12:51:25.694 - Active form =
Thread 01 - 2012/03/29 12:51:25.694 - Active app =

显示活动窗体和应用程序的最后几行分别显示Form.ActiveForm和Windows中当前活动的应用程序(此处的代码)。它们都是空的/空的。即使在登录表单Load中,我按照@memetolsen的建议调用Activate()SetForegroundWindow(),情况也是如此。登录表单甚至从未受到关注!

有什么想法吗?

编辑#2:好吧,我刚刚取消了启动屏幕,现在登录表单成为焦点。更换启动屏幕会重新引入错误。但我已经输入了代码,以确保在我尝试打开登录表单之前,启动屏幕被处理,而不仅仅是关闭。

Application.Run(frmSplash)打开启动屏幕会有什么不同吗?

模式对话框没有';无法集中注意力

用Application.Run(frmSplash)打开启动屏幕会有什么不同吗

当然,这样做可以保证你会遇到这种问题。之所以会出现此问题,是因为在瞬间,您没有可以接收焦点的窗口。启动屏幕已经消失,您的主窗口仍然需要几毫秒才能创建和显示。这将迫使Windows找到另一个窗口来提供焦点。由于它不能是您的窗口,它将选择另一个应用程序的窗口。出现时,主窗口将没有焦点。

窗口管理器使用的确切规则我不清楚,这种注意力不集中的情况并不总是发生。我猜这与时间有关。

通过使用框架中已经内置的对启动屏幕的出色且无故障的支持来解决您的问题。你会在这个答案中找到使用它的代码。如果您不想使用它,请重新编写代码,以确保在关闭启动屏幕之前显示主窗口。

我之前也遇到过类似的问题,问题是由于启动屏幕关闭不当造成的。我怀疑焦点可能在那个表格上(但不确定)。

  1. 确保正确卸载/关闭启动屏幕窗体
  2. 正确卸载启动屏幕后显示登录屏幕
  3. 登录表单显示为模态,指示执行指针等待下一次用户交互

我建议您设置远程调试。这将使您能够从开发机器远程调试应用程序。

如果你把这个放在上,也许这是一个解决方案

this.Activate();

或者这个:

SetForegroundWindow(this.Handle.ToInt32());

在表单的加载事件中。

如果这不起作用,请尝试使用计时器,该计时器会在一定时间后生成此代码。