C# 显示并关闭对话框后,win32 GetForeGroundIndow()仍会返回该窗口

C# 显示并关闭对话框后,win32 GetForeGroundIndow()仍会返回该窗口,c#,C#,我的应用程序没有主窗体。初始化在Program.Main()中完成,然后调用Application.Run() 当用户在不同的应用程序中时,他们会按下键盘快捷键,从而在我的应用程序中触发以下操作: 实例化我的表单 出示表格 调用win32 API GetForegroundWindow()以确定哪个窗口处于活动状态 做点什么 调用表单。关闭() Set form=null 我可以执行上述几次,一切都很好。但是,如果我的应用程序在任何时候调用MessageBox(),则对GetForeground

我的应用程序没有主窗体。初始化在Program.Main()中完成,然后调用Application.Run()

当用户在不同的应用程序中时,他们会按下键盘快捷键,从而在我的应用程序中触发以下操作:

  • 实例化我的表单
  • 出示表格
  • 调用win32 API GetForegroundWindow()以确定哪个窗口处于活动状态
  • 做点什么
  • 调用表单。关闭()
  • Set form=null
  • 我可以执行上述几次,一切都很好。但是,如果我的应用程序在任何时候调用MessageBox(),则对GetForegroundWindow()的所有后续调用都将返回已关闭的表单,即使当前焦点位于不同的应用程序中。如果CredUIPromptForCredentials()提示用户输入登录名和密码,也会发生这种情况。调用ProcessInfo.GetActiveProcess()还返回我的进程,而不是具有焦点的其他应用程序

    知道我做错了什么吗?是否有可能我可以打电话从我的应用程序中删除焦点;有点像SetForeGroundindow的反面

    编辑1

    它实际上是一个非模态形式,不是一个对话框。我使用不带参数的Show()来显示表单。我尝试在Close()之后调用Dispose(),但行为相同。我确认,如果我从未在表单上调用Show(),应用程序将正常工作。除了更改标题外,表单具有在VS2010中创建表单时获得的所有默认值。该表单仅包含一个标签。

    每个文档来自:

    关闭时未处理表单的两个条件是:(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见;(2)您已经使用ShowDialog显示了表单。在这些情况下,您将需要手动调用Dispose以将表单的所有控件标记为垃圾收集


    我假设你的表单是一个对话框,因为这就是标题中提到的。看起来您需要显式调用Dispose来释放win32资源。

    谢谢您的回答。尝试你的建议的结果在我的问题中。因为它不是一个模态对话框,这显然不适用。这种情况发生在什么风格的windows上?