0

我有一个程序,在调用表单之前我需要做一些初始工作,所以我禁用了应用程序框架设置并编写了我自己的 Main 函数,并在运行表单时调用 Application.Run(myForm)。

一切正常,没有问题,但现在在打开表单之前我需要一些其他服务。与其将所有代码都添加到该程序中,不如将其全部移至其自己的可执行文件中。第二个程序可以编辑第一个程序将使用的文件,所以我需要第一个程序等待,以便它会读取这些更改(如果他们做出)。我想可以很容易地使用 Shell 函数,但是由于各种原因,我正在创建自己的 Process 对象并通过它调用它/等待它。

无论如何,我在 Application.Run 调用之前的某个时间调用了第二个程序。第一个程序等待,我可以成功与第二个程序交互,完全没有麻烦。但完成后,第一个程序的窗口隐藏在屏幕上的任何其他窗口后面。这不会在 XP 中发生,仅在 Vista 中(可能是 7,但我尚未确认)。我已经尝试过手动强制表单出现在前面,最小化然后最大化,获得焦点等,但是除非用户用鼠标手动单击它,否则没有任何东西将它带到前面。

我究竟做错了什么?为什么会出现这种行为?我知道这与等待可执行文件完成有关,因为如果我不强制第一个程序等待一切都很好(除了它不等待)。我可以通过在表单的 Load 事件中调用第二个程序来规避这个问题,但是我必须再次读取文件以捕获更改而不是读取一次,而且它看起来也很糟糕,因为正在绘制表单当第二个程序坐在那里时,真的很慢。

如果有人有任何意见,我将不胜感激。

4

2 回答 2

2

这并不是您遇到这种行为的真正答案,但一个简单的解决方法是在加载事件中临时设置表单的TopMost属性。True然后,根据您希望它的侵入性,您可以在较短的计时器下重置它或等待MouseEnter事件触发。

于 2012-07-17T16:11:30.193 回答
1

这个网站上有另一个关于这个的话题,但我没有得到链接。这个问题似乎是 .NET 框架中的一个错误。下面的 API(VB.NET 示例)适用于 Windows XP 和 8.1。请勿在其他版本的 Windows 中进行测试。

<Runtime.InteropServices.DllImport("user32")> _
Public Shared Function SetForegroundWindow(hwnd As IntPtr) As Integer
End Function

Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
    SetForegroundWindow(Handle)
End Sub
于 2014-01-08T19:33:50.813 回答