7

Is there a way to get access to a window handle in windows using WSH, or WMI or similar? I just want to flag a window as always-on-top. Ideally I'd use windows script host for this.

ᄂ ᄀ
  • 3,875
  • 1
  • 19
  • 18
Jotham
  • 478
  • 1
  • 7
  • 13

3 Answers3

5

To grab it with WSH, you can use the COM DLL found in this CodeProject article. Using this, you can then grab a window handle like so:

Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")

This is also very easy in PowerShell.

example:

(Get-Process powershell).MainWindowHandle

This grab's the window handle of the PowerShell process.


Although if your main goal is to make a window topmost, there are many programs for this such as DeskPins:

alt text

Gaff
  • 18,569
  • 15
  • 57
  • 68
John T
  • 163,373
  • 27
  • 341
  • 348
  • Can I also get the window handle of the current powershell window? Since I have 3 windows open, I get three handles. I could just try each one and see which is the one I want, but that can't be automated. – Metallkiller Dec 14 '17 at 09:42
  • 1
    @Metallkiller `(Get-Process -id $pid).MainWindowHandle` does that since `$pid` ["contains the process identifier (PID) of the process that is hosting the current PowerShell session."](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables#pid) – MarredCheese Sep 07 '21 at 02:54
3

I know it's a massive necro and pardon if it was solved already, but I've been struggling with it for some time now and here's a really simple solution I wrote:

function WinExist($winTitle, $instance = 0)
{
    $h = Get-Process | Where-Object { $_.MainWindowTitle -match $winTitle } | ForEach-Object { $_.MainWindowHandle }
    if ( $h -eq $null )
    {
        return 0
    }
    else
    {
        if ( $h -is [System.Array] )
        {

            $h = $h[$instance]
        }
        return $h
    }
}

Returns "0" if window wasn't found, or the window handle. If found more windows matching the $winTitle string it returns the $instance number (0 means first window, 1 second, etc.).

Example:

# WinExist str_WindowTitle int_WindowNumber
# returns the handle of second notepad window (if more than 1 opened)
$hwnd = WinExist "notepad" 1 
TIM
  • 61
  • 4
0

I just want to flag a window as always-on-top.

have a look at Eusing's Auto Window Manager. not only can you automatically keep all windows you specify always on top but you can also apply transparency effects from 0% (fully transparent) to 100% (solid).

Auto Window Manager is freeware.