Ok, j'ai appris comment le faire, nous avons besoin d'appeler l'API Windows. L'astuce consiste à obtenir le HWND, qui est exposé dans Excel et Powerpoint, mais pas dans Word. La seule façon de l'obtenir est de changer le nom de la fenêtre de l'application en quelque chose d'unique et de le trouver en utilisant "FindWindow". Ensuite, on peut obtenir le PID en utilisant la fonction "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
qui ne fonctionne pas: Get-Process: ne peut pas lier le paramètre 'InputObject'. Impossible de convertir la valeur "System .__ ComObject" du type "System .__ ComO bject # {000208d5-0000-0000-c000-000000000046}" pour saisir "System.Diagnostics.Process". –