Ephebopus
Ephebopus

Reputation: 25

PowerShell Get process by its handle

$ActiveHandle = [UserWindows]::GetForegroundWindow()
$Process = Get-Process | ? {$_.MainWindowHandle -eq $ActiveHandle}

This code retrieves a title of the current active window. Problem is that it only filters processes by MainWindowHandle. For example, if my active handle is a popup from the same process, it doesn't return anything as the handle is not its main handle. How can I modify the code to check for ALL handles instead of just the main one? Or rather, how can I retrieve all process handles? I do not want to use external tools like WASP.

Upvotes: 0

Views: 2303

Answers (1)

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174970

You can use the GetWindowThreadProcessId Win32 API function for this:

# Define a type that allows us to call the relevant win32 api
$user32 = Add-Type -MemberDefinition @'
[DllImport("user32.dll", SetLastError=true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
'@ -PassThru -Name user32Func

# prepare a variable to receive the target process id
$procId = 0

# call the function with, pass the handle as the first argument
$threadId = $user32::GetWindowThreadProcessId($ActiveHandle, [ref]$procId)

# If the owning thread and process was identified, the return-value will have been non-0
if($threadId) {
  Write-Host "Found process $(Get-Process -Id $procId |% Name) with PID $procId"
}
else {
  Write-Host "No owning process found"
}

Upvotes: 1

Related Questions