打开外部应用程序后将 Windows 个表格 window 返回到前面

Bring Windows Forms window back to front after opening an external application

我正在从我的 VB.net Windows 表单申请中打开一个 PDF:

Try
    Process.Start(fileName)
Catch e As System.ComponentModel.Win32Exception 'no PDF viewer installed, use browser
    Dim startinfo As New ProcessStartInfo
    startinfo.FileName = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
    startinfo.Arguments = String.Format(fileName)
    startinfo.UseShellExecute = False
    Process.Start(startinfo)
End Try

我希望我的申请表在打开 PDF 后回到前面。我已经尝试了所有这些,但都不起作用:

Me.Activate()
Me.BringToFront()
Me.TopMost = True        
Me.TopMost = False

仅使用 Me.TopMost=True 实际上可行,但我不想强制我的应用程序出现在所有其他应用程序的前面 windows。我只想在 PDF 打开后将它放在前面一次。一旦我添加命令 Me.TopMost = False 来重置它,它就不再起作用了。

我不知道您是否可以使用特定的 API 来完成您的要求,但从我的角度来看,您已经找到了解决方案:

Me.TopMost = True        
Me.TopMost = False

您必须在 PDF 打开操作结束后立即使用这两行。

这是一个使用以下代码的示例:

Imports System.Threading

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Green
        Label1.Text = "Start"
    End Sub

    Private Sub PdfOperation_Simulation(sender As Object, e As MouseEventArgs) Handles Label1.MouseDown
        Me.BackColor = Color.Red
        Label1.Text = "Wait..."
        Me.Refresh()
        Thread.Sleep(3000) 'Pdf opening... I manually bring to front VisualStudio
        Me.TopMost = True
        Me.TopMost = False
        Me.BackColor = Color.Green
        Label1.Text = "Finish"
    End Sub

End Class

输出:


更新

It just does not work for me. I have simplified my code to Dim startinfo As New ProcessStartInfo startinfo.FileName ="C:\README.TXT" startinfo.UseShellExecute = True Process.Start(startinfo) Me.TopMost = True Me.TopMost = False This opens notepad, but my application is not coming to front.

这是因为记事本window显示操作需要一些时间。根据您的需要,您只需在 Me.TopMost = False 之前使用 Thread.Sleep 等待几秒钟,或执行以下操作:

Dim startinfo As New ProcessStartInfo
startinfo.FileName = "C:\README.TXT"
startinfo.UseShellExecute = True
Process.Start(startinfo)

Dim t As New Thread(
    Sub()
        Thread.Sleep(1000)' One second
        Me.Invoke(Sub() MoveOnTop())
    End Sub
)
t.Start()

其中MoveOnTop

Private Sub MoveOnTop()
    Me.TopMost = True
    Me.TopMost = False
End Sub

使用线程,您的应用程序将不会被 Sleep 操作冻结。

只是另一种选择。您是否考虑过将记事本的 WindowStyle 设置为 minimized?这是一个例子:

Dim startinfo As New ProcessStartInfo("Notepad")
startinfo.Arguments = "C:\README.TXT"
startinfo.UseShellExecute = True
startinfo.WindowStyle = ProcessWindowStyle.Minimized
Process.Start(startinfo)