【发布时间】:2012-04-12 00:27:40
【问题描述】:
我正在处理与 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 中当前活动的应用程序(此代码为 here)。而且它们都是空的/空的。就是这样,即使在登录表单加载中我按照@memetolsen 的建议调用Activate() 或SetForegroundWindow()。登录表单甚至从未获得焦点!
有什么想法吗?
编辑#2:好吧,我刚刚消除了初始屏幕,现在登录表单获得焦点。更换启动画面会重新引入错误。但是我已经输入了代码以确保在我尝试打开登录表单之前 disposed 启动屏幕 - 而不仅仅是关闭。
使用Application.Run(frmSplash) 打开启动画面会有所不同吗?
【问题讨论】:
-
事后附加调试器。
-
启动画面是否已处理,或者是否仍会干扰主 UI 消息线程。
-
当另一个窗口尝试激活时,您会在模式窗口中获得闪烁的标题。