Получить PID COM-сервера - PullRequest
0 голосов
/ 26 октября 2010

Я создаю com-объект в powershell следующим образом:

$application = new-object -ComObject "word.application"

Есть ли способ получить PID (или другой уникальный идентификатор) запущенного экземпляра MS Word?

Я хочу проверить, не заблокирована ли программа, например, модальными диалоговыми окнами, запрашивающими пароли, и я не могу сделать это из PowerShell.

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Хорошо, я узнал, как это сделать, нам нужно вызвать Windows API.Хитрость заключается в том, чтобы получить HWND, который предоставляется в Excel и Powerpoint, но не в Word.Единственный способ получить это - изменить имя окна приложения на что-то уникальное и найти его с помощью «FindWindow».Затем мы можем получить PID с помощью функции «GetWindowThreadProcessId»:

Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public static class Win32Api
{
[System.Runtime.InteropServices.DllImportAttribute( "User32.dll", EntryPoint =  "GetWindowThreadProcessId" )]
public static extern int GetWindowThreadProcessId ( [System.Runtime.InteropServices.InAttribute()] System.IntPtr hWnd, out int lpdwProcessId );

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}
"@


$application = new-object -ComObject "word.application"

# word does not expose its HWND, so get it this way
$caption = [guid]::NewGuid()
$application.Caption = $caption
$HWND = [Win32Api]::FindWindow( "OpusApp", $caption )

# print pid
$myPid = [IntPtr]::Zero
[Win32Api]::GetWindowThreadProcessId( $HWND, [ref] $myPid );
"PID=" + $myPid | write-host
0 голосов
/ 26 октября 2010

вы можете использовать

 get-process -InputObject <Process[]>
...