Pregunta

crear un objeto COM en PowerShell, así:

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

¿Hay una manera de obtener el PID (o algún otro identificador único) de la instancia de MS Word en marcha?

Quiero comprobar si el programa se bloquea, por ejemplo, por cuadros de diálogo modales pidiendo contraseñas, y no puedo hacerlo desde whithin PowerShell.

¿Fue útil?

Solución

Bueno, he encontrado la manera de hacerlo, tenemos que llamar a la API de Windows. El truco es conseguir que el HWND, que se expone en Excel y Powerpoint, pero no en Word. La única manera de conseguirlo es cambiar el nombre de la ventana de la aplicación a algo único y encontrar que el uso de "FindWindow". Entonces, podemos obtener el PID usando la función "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

Otros consejos

que puede ser capaz de utilizar

 get-process -InputObject <Process[]>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top