Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.

(Should also be tagged as WSH).


share|improve this question
added WSH tag for ya – John T Nov 24 '09 at 5:15
up vote 3 down vote accepted

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.


(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

share|improve this answer
Thanks John, but I'm ideally after a .VBS solution. We're a bit nervous about what we run on this particular machine and have other VBS files running as part of the system. – Jotham Nov 24 '09 at 5:17
Ah well, I tried. Thought this might fall into the "or similar" category :P – John T Nov 24 '09 at 5:19
added a WSH solution :) – John T Nov 24 '09 at 5:23

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.

share|improve this answer

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
        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.).


# WinExist str_WindowTitle int_WindowNumber
# returns the handle of second notepad window (if more than 1 opened)
$hwnd = WinExist "notepad" 1 
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.