是否有托管的VB.net方法从HWND获取进程ID,而不是使用此Windows API调用。
Private Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
Sub GetProcessID()
'start the application
Dim xlApp As Object = CreateObject("Excel.Application")
'get the window handle
Dim xlHWND As Integer = xlApp.hwnd
'this will have the process ID after call to GetWindowThreadProcessId
Dim ProcIdXL As Integer = 0
'get the process ID
GetWindowThreadProcessId(xlHWND, ProcIdXL)
'get the process
Dim xproc As Process = Process.GetProcessById(ProcIdXL)
End Sub
答案 0 :(得分:1)
不,这不是由.NET包装的。但是调用本机API函数绝对没有错。这就是框架在内部所做的事情,这就是P / Invoke被发明的原因,为了让你自己做到这一点尽可能简单。我不确定你为什么要避免它。
当然,我建议使用新式声明,这是在.NET中使用的更惯用的方式(而不是旧的VB 6方式):
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
ByRef lpdwProcessId As Integer) As Integer
End Function
你的另一个选择,如果你完全无法克服托管代码的非理性强制,就是使用Process
类。这可用于启动外部进程,并具有可用于检索进程ID的属性(Id
)。我不确定这是否适合你。您特别避免告诉我们您为什么首先使用CreateObject
。