如何使用托管VB.net代码从HWND获取进程ID?

时间:2013-07-22 00:35:51

标签: vb.net

是否有托管的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

1 个答案:

答案 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