繁体   English   中英

模态对话框没有得到关注

[英]Modal dialog doesn't get focus

我正在处理一个与C#WinForms应用程序有关的错误,该错误以启动屏幕启动,然后关闭启动屏幕并打开登录表单。 在某些计算机上,一切正常。 在其他表单上,将显示登录表单,但带有闪烁的标题栏,该标题栏在闪烁几下后完全失去焦点。 光标仍在“用户名”(User name)文本框中闪烁,但该应用程序没有焦点,并且当您开始键入内容时,什么也没有发生,这对用户来说很烦人。

所运行的操作系统(我们尝试使用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行分别显示Form.ActiveForm和Windows中当前活动的应用程序( 此处的代码)。 而且它们都是空的。 即使是在登录表单“加载”中,我也会按照@memetolsen的建议调用Activate()SetForegroundWindow() 登录表单甚至从未获得关注!

有任何想法吗?

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

使用Application.Run(frmSplash)打开初始屏幕会有所不同吗?

使用Application.Run(frmSplash)打开初始屏幕会有所不同吗

当然,以这种方式进行操作可确保您会遇到此类问题。 造成此问题的原因是,一瞬间您没有可接收焦点的窗口。 初始屏幕不见了,您的主窗口仍然需要几毫秒的时间才能创建并可见。 这将迫使Windows找到另一个焦点所在的窗口。 由于它不是您的窗口,它将选择另一个应用程序的窗口。 出现时,主窗口将没有焦点。

窗口管理器使用的确切规则对我来说并不明确,这种焦点丢失并不总是会发生。 我猜这与时间有关。

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

我之前也遇到过类似的问题,该问题是由于启动画面关闭不当造成的。 我怀疑重点可能在表单上(虽然不确定)。

  1. 确保正确卸载/关闭启动画面表单
  2. 正确卸载启动画面后,将显示登录画面
  3. 登录表单显示为模式,以指示执行指针等待下一次用户交互

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

如果您输入以下内容,可能会是一个解决方案:

this.Activate();

或这个:

SetForegroundWindow(this.Handle.ToInt32());

在表单的load事件中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM