为什么我的表单出现在一切背后?

时间:2012-07-17 15:42:45

标签: vb.net winforms

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

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

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

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

如果有人有任何意见,我会很感激。

2 个答案:

答案 0 :(得分:2)

这并不能解决您遇到此问题的原因,但一个简单的解决方法是在加载事件中临时将表单的TopMost属性设置为True。然后,根据您想要的侵入程度,您可以在短暂的计时器下重置它,或等待说出MouseEnter事件。

答案 1 :(得分:0)

此网站还有另一个主题,但我没有链接。这个问题似乎是.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