我在 powershell 中创建一个 com 对象,如下所示:
$application = new-object -ComObject "word.application"
有没有办法获取启动的 MS Word 实例的 PID(或其他一些唯一标识符)?
我想检查程序是否被阻止,例如模式对话框要求输入密码,而我无法从 PowerShell 中执行此操作。
我在 powershell 中创建一个 com 对象,如下所示:
$application = new-object -ComObject "word.application"
有没有办法获取启动的 MS Word 实例的 PID(或其他一些唯一标识符)?
我想检查程序是否被阻止,例如模式对话框要求输入密码,而我无法从 PowerShell 中执行此操作。
好的,我找到了方法,我们需要调用 Windows API。诀窍是获取 HWND,它在 Excel 和 Powerpoint 中公开,但在 Word 中不公开。获得它的唯一方法是将应用程序窗口的名称更改为唯一的名称并使用“FindWindow”找到它。然后,我们可以使用“GetWindowThreadProcessId”函数获取 PID:
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 <Process[]>