2015-10-27 130 views
0

是否有可能獲取基於它的子窗口句柄在PowerShell中的進程ID?通過窗口句柄獲取父進程ID

例如,這個劇本找窗口句柄與titile「警告」:

$sig = @" 
    [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
    public static extern IntPtr FindWindow(IntPtr sClassName, String sAppName); 

    [DllImport("kernel32.dll")] 
    public static extern uint GetLastError(); 
"@ 

$fw = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $sig -PassThru 
$wname='Warning' 

$find_window = $fw::FindWindow([IntPtr]::Zero, $wname) 
Write-Host $find_window 

它是如何顯示在任務管理器:

Program.exe 
| 
    \Warning 

現在我需要確定 - 什麼PID有此警告窗口。我知道可以在C#中實現(我根本不使用它),但是這隻能在PowerShell中完成。

回答

3

您正在尋找GetWindowThreadProcessId。根據這一answer,你可以調用從PowerShell中與此的P/Invoke:

[DllImport("User32.dll")] 
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); 

你在第一個參數提供一個窗口句柄。進程和線程ID分別在第二個參數和返回值中返回。