Хорошо, я узнал, как это сделать, мы должны вызвать 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
Это не работает: Get-Process: Невозможно привязать параметр 'InputObject'. Невозможно преобразовать значение «System.__ ComObject» типа «System .__ ComO bject # {000208d5-0000-0000-c000-000000000046}» для ввода «System.Diagnostics.Process». –