2015-01-08 2 views
0

Я построил Powershell скрипт (с помощью осы), который устанавливает любого окна режима в «всегда на вершине».Получить название окна с помощью курсора мыши в Powershell/wasp?

Я запустить сценарий с помощью:

Get-WindowByTitle *emul* | Set-TopMost

  • Зачем мне это нужно *

Когда я программирую в Eclipse/Androidstudio - Я хочу эмулятор, чтобы всегда быть впереди?. так что сценарий ищет все окна, у которых есть заголовок вроде emul (, который является частью фактического названия "emulator.exe") и устанавливает его всегда сверху.

Хорошо.

Но теперь я хочу сделать это для каждого окна без изменения сценария.

Как я смогу выбрать окно? курсором мыши (только для зависания). (Когда я поставил курсор calc.exe и нажмите некоторую последовательность клавиш - которая будет активировать скрипт PS - он будет искать какое окно имеет курсор на)

Вопрос

Как может Я выбираю окно title окна с курсором мыши на нем? (Окно не должен быть активным)

Пример:

смотрите:

enter image description here

Я хочу, чтобы получить MyChromeBrowserTitle хотя это в фоновом режиме, (и блокнотом впереди). он должен вернуть название хром, потому что курсор находится в хромированном окне.

ответ

2

Возможно, это не лучший способ сделать это, и он не будет работать для окон проводника, поскольку Explorer работает под управлением рабочего стола + некоторых окон браузера. Однако это работает для остальных.

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 
     } 
    } 
} 

EDIT

Как я бегу 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 
     } 
    } 
} 
+0

Спасибо, но почему я получаю эти ошибки? http://i.imgur.com/rxdh7xO.png –

+0

Интересно, что здесь хорошо работает с ISE или другими редакторами Powershell. Какую версию Powershell вы используете? –

+0

http://i.imgur.com/xhbzuvT.png –

 Смежные вопросы

  • Нет связанных вопросов^_^