1

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

1 回答 1

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首先使用的原因。

于 2013-07-22T06:20:28.410 回答