![有没有办法使用 WSH、WMI 或类似方法访问 Windows 中的窗口句柄?](https://linux22.com/image/1222962/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E4%BD%BF%E7%94%A8%20WSH%E3%80%81WMI%20%E6%88%96%E7%B1%BB%E4%BC%BC%E6%96%B9%E6%B3%95%E8%AE%BF%E9%97%AE%20Windows%20%E4%B8%AD%E7%9A%84%E7%AA%97%E5%8F%A3%E5%8F%A5%E6%9F%84%EF%BC%9F.png)
有没有办法使用 WSH、WMI 或类似程序访问 Windows 中的窗口句柄?我只想将窗口标记为始终在最上面。理想情况下,我会为此使用 Windows 脚本主机。
答案1
要使用 WSH 获取它,您可以使用位于这篇 CodeProject 文章. 使用这个,你可以像这样抓取窗口句柄:
Set obj = CreateObject("APIWrapperCOM.APIWrapper")
winHandle = obj.FindWindow("test.txt - Notepad")
这也很容易电源外壳。
例子:
(Get-Process powershell).MainWindowHandle
这将获取 PowerShell 进程的窗口句柄。
虽然如果你的主要目标是使窗口位于最顶层,但有很多程序可以做到这一点,例如DeskPins:
答案2
我知道如果它已经解决了,这将是一个巨大的损失,但我已经为此挣扎了一段时间,下面是我写的一个非常简单的解决方案:
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
}
}
如果未找到窗口,则返回“0”或窗口句柄。如果找到更多与 $winTitle 字符串匹配的窗口,则返回 $instance 编号(0 表示第一个窗口,1 表示第二个窗口,等等)。
例子:
# WinExist str_WindowTitle int_WindowNumber
# returns the handle of second notepad window (if more than 1 opened)
$hwnd = WinExist "notepad" 1
答案3
我只是想将窗口标记为始终在最上面。
看看 Eusing 的自动窗口管理器. 您不仅可以自动保留您指定的所有窗口总在最前面但你也可以申请透明效果从 0%(完全透明)到 100%(实心)。
自动窗口管理器是免费软件。