打开外部应用程序后将 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)
我正在从我的 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)