2010-10-26 3 views
0

создать COM-объект в PowerShell следующим образом:Получить PID из COM-сервера

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

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

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

ответ

1

Хорошо, я узнал, как это сделать, мы должны вызвать API Windows. Хитрость заключается в том, чтобы получить 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

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

get-process -InputObject <Process[]> 
+0

Это не работает: Get-Process: Невозможно привязать параметр 'InputObject'. Невозможно преобразовать значение «System.__ ComObject» типа «System .__ ComO bject # {000208d5-0000-0000-c000-000000000046}» для ввода «System.Diagnostics.Process». –

Смежные вопросы