我已经构建了一个powershell脚本(使用wasp ),它将任何窗口设置为“始终位于顶部”模式。
我通过以下方式运行脚本:
Get-WindowByTitle *emul* | Set-TopMost
当我在Eclipse/Androidstudio
编程时 - 我希望模拟器始终在前面。所以脚本正在查找所有标题为emul
的窗口(,它是实际标题的一部分"emulator.exe"
)并将其设置为始终位于顶部。
好。
但现在我想在不更改脚本的情况下为每个窗口执行此操作。
我如何选择窗口?通过鼠标光标(仅悬停)。 (当我将鼠标放在calc.exe上,并按下一些按键序列 - 这将激活PS脚本 - 它将搜索哪个窗口有光标在)
问题
如何选择带有鼠标光标的窗口的title
? (窗口不必须处于活动状态)
示例:
看着:
我想得到MyChromeBrowserTitle
虽然它在后台,(并且记事本在前面)。它应返回chrome的标题,因为光标位于chrome窗口。
答案 0 :(得分:2)
以下可能不是执行此操作的最佳方式,因为资源管理器正在运行桌面+某些特定的文件夹资源管理器窗口,所以它不适用于资源管理器窗口。然而,它适用于其余部分。
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Utils
{
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
public static extern bool GetWindowRect(
HandleRef hWnd,
out RECT lpRect);
}
"@
Add-Type -AssemblyName System.Windows.Forms
$p = [Windows.Forms.Cursor]::Position
Get-Process | %{
if ($_.MainWindowHandle)
{
$o = New-Object -TypeName System.Object
$href = New-Object -TypeName System.RunTime.InteropServices.HandleRef -ArgumentList $o, $_.MainWindowHandle
$rect = New-Object utils+RECT
[Void][Utils]::GetWindowRect($href, [ref]$rect)
if ($p.X -ge $rect.Left -and $p.X -le $rect.Right -and
$p.Y -ge $rect.Top -and $p.Y -le $rect.Bottom
)
{
$_.MainWindowTitle
}
}
}
修改强>
当我运行Powershell V3时,上面的代码对我有用。
我尝试设置Set-StrictMode -Version 2
,因此我们正在运行相同的版本。
以下适用于V2:
$def = @'
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[DllImport("user32.dll")]
public static extern bool GetWindowRect(
HandleRef hWnd,
out RECT lpRect);
'@
Add-Type -MemberDefinition $def -Namespace Utils -Name Utils
Add-Type -AssemblyName System.Windows.Forms
$p = [Windows.Forms.Cursor]::Position
Get-Process | %{
if ($_.MainWindowHandle)
{
$o = New-Object -TypeName System.Object
$href = New-Object -TypeName System.RunTime.InteropServices.HandleRef -ArgumentList $o, $_.MainWindowHandle
$rect = New-Object Utils.Utils+RECT
[Void][Utils.Utils]::GetWindowRect($href, [ref]$rect)
if ($p.X -ge $rect.Left -and $p.X -le $rect.Right -and
$p.Y -ge $rect.Top -and $p.Y -le $rect.Bottom
)
{
$_.MainWindowTitle
}
}
}