在显示和关闭对话框后,GetForegroundWindow()仍然返回该窗口
本文关键字:返回 窗口 GetForegroundWindow 显示 对话框 | 更新日期: 2023-09-27 18:14:34
我的应用程序没有主表单。初始化在Program.Main()中完成,然后调用Application.Run()。
当用户在不同的应用程序时,他们按下键盘快捷键,在我的应用程序中触发以下操作:
- 实例化我的表单。
- 显示表单
- 调用win32 API GetForegroundWindow()找出哪个窗口是活动的。
- 调用form.Close ()
- Set form = null
我可以执行上面几次,一切都很好。但是,如果我的应用程序在任何时候调用MessageBox(),即使当前焦点在不同的应用程序中,对GetForegroundWindow()的所有后续调用也将返回已关闭的窗体。如果CredUIPromptForCredentials()提示用户输入登录名和密码,也会发生这种情况。调用ProcessInfo.GetActiveProcess()也返回我的进程,而不是有焦点的其他应用程序。
知道我可能做错了什么吗?有没有什么东西可以让我从应用中移除焦点;SetForeGroundWindow的反转?
编辑1
它实际上是一个非模态形式,而不是一个对话框。我使用Show()没有参数来显示表单。我尝试在Close()之后调用Dispose(),但行为是相同的。我确认,应用程序工作正确,如果我从来没有调用Show()在我的形式。当你在VS2010中创建它时,除了更改标题外,表单具有所有默认值。这个表单只包含一个标签
按文档从表单。关闭:
窗体不被Close处理的两个条件是:(1)它是多文档接口(MDI)应用程序的一部分,窗体不可见;(2)使用ShowDialog显示表单。在这些情况下,您需要手动调用Dispose来将所有窗体控件标记为垃圾收集。
我假设你的表单是一个对话框,因为这是在标题中提到的。看起来您需要显式地调用Dispose来释放win32资源。