Yoo*_*suf 1 vb.net external-process mdichild
我需要在 VB.NET MDI 窗体中打开一些外部应用程序,例如 notepad.exe,并且我还需要确保始终只有一个副本在运行。
我使用了下面的代码,但它什么也没做。它给出了错误 SetParent 未声明且 findWindow 未声明
Dim myProcess As Process = New Process()
Dim MyHandle As IntPtr
myProcess.StartInfo.FileName = "Notepad.exe"
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal
myProcess.Start()
MyHandle = FindWindow(vbNullString, "C:\Windows\Notepad.exe")
SetParent(MyHandle, Me.Handle)
myProcess.WaitForExit()
Run Code Online (Sandbox Code Playgroud)
这是我用来验证只有一个实例正在运行的代码
If (System.Diagnostics.Process.GetProcesses.Equals("notepad.exe")) Then
MsgBox("Only One Instance!")
Else
Dim p As New System.Diagnostics.Process
p.StartInfo.FileName = "notepad.exe"
p.Start()
End If
Run Code Online (Sandbox Code Playgroud)
此代码正在打开 notepad.exe,但不检查以前的实例。所以每次我点击按钮它都会打开一个新的记事本
小智 5
必须先声明 SetParent 和 FindWindow,然后才能使用它们,这就是您收到错误的原因。您在查找 Notepad 的现有实例时也遇到问题,因为 GetProcesses 返回一个集合,而不是单个进程。要使用您正在尝试的方法,您需要遍历整个集合以查看它是否包含匹配项或使用 .Contains。在我的示例中我没有使用 FindWindow,但是如果您将来需要它,我已经包含了它的声明。示例代码假定要使用的表单名为 Form1,并且代码是用 Button1 激活的。
代码:
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("User32", CharSet:=CharSet.Auto, ExactSpelling:=True)> Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndParent As IntPtr) As IntPtr
End Function
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim PROCHANDLE As System.IntPtr = -1
For Each proc In Process.GetProcesses
If LCase(proc.ProcessName) = "notepad" Then
PROCHANDLE = proc.Handle
End If
Next
If PROCHANDLE = -1 Then
PROCHANDLE = Process.Start("C:\windows\notepad.exe").Handle
SetParent(PROCHANDLE, Me.Handle)
End If
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11058 次 |
| 最近记录: |