0

我已经建立了一个 powershell 脚本(使用 wasp),它将任何窗口设置为“始终在顶部”模式。

我通过以下方式运行脚本:

Get-WindowByTitle *emul* | Set-TopMost

  • 为什么我需要它?*

当我编程时Eclipse/Androidstudio- 我希望模拟器总是在前面。所以脚本正在寻找所有具有类似标题的窗口emul这是实际标题的一部分"emulator.exe")并将其设置为始终位于顶部。

好的。

但是现在我想在不更改脚本的情况下对每个窗口都这样做。

我将如何选择窗口?通过鼠标光标(仅悬停)。(当我将鼠标放在 calc.exe 上,然后按一些键序列 - 这将激活 PS 脚本 - 它会搜索光标所在的窗口

问题

如何选择title有鼠标光标的窗口?(窗口不必处于活动状态)

例子 :

看着 :

在此处输入图像描述

我想得到MyChromeBrowserTitle虽然它在后台,(并且记事本在前面)。它应该返回 chrome 的标题,因为光标位于 chrome 窗口。

4

1 回答 1

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
        }
    }
}
于 2015-01-08T13:09:19.120 回答