模态对话框无法获得焦点

Sha*_*ica 0 c# winforms

我正在处理与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 =
Run Code Online (Sandbox Code Playgroud)

显示活动表单和应用程序的最后一行分别显示Form.ActiveForm和Windows中当前活动的应用程序(此处的代码).它们都是空的/无效的.即便如此,即使在登录表单中加载I调用Activate()SetForegroundWindow()@memetolsen建议.登录表单甚至从未获得焦点!

有任何想法吗?

编辑#2:嗯,我刚刚删除了启动画面,现在登录表单得到了关注.更换启动屏幕会重新引入错误.但我已经把代码,以保证初始屏幕配置 -不只是关闭-之前,我试图打开登录表单.

打开闪屏是否会有所不同Application.Run(frmSplash)

Han*_*ant 5

是否可以通过Application.Run(frmSplash)打开启动画面

当然,这样做可以保证你会遇到这种问题.造成这种麻烦是因为瞬间没有可以接收焦点的窗口.启动画面消失了,您的主窗口仍需要几毫秒才能创建并可见.这会强制Windows找到另一个窗口来关注焦点.由于它不能是你的窗口,它将选择另一个应用程序的窗口.出现时,您的主窗口将没有焦点.

窗口管理器使用的确切规则对我来说并不清楚,这种焦点损失并不总是发生.我猜这是时间相关的.

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