2014-09-10 4 views
1

Я хочу перечислить все окна процесса, скажем Word. Это только дает мне главное окно:Получить все окна процесса в powershell

Get-Process winword |where {$_.mainWindowTItle} |format-table id,name,mainwindowtitle –AutoSize 

Я хочу также перечислить Document1 здесь.

Id Название MainWindowTitle


1616 WINWORD документ2 - Microsoft Word

есть ли способ, чтобы получить доступ к другим, чем основной, окна?

+1

Вы можете использовать [EnumWindows] (http://stackoverflow.com/questions/820909/get-applications-window-handle). Однако это код Win32, а не код .NET, поэтому это может быть не самый простой подход. Имейте в виду, что [многие приложения используют скрытые окна] (http://stackoverflow.com/questions/2970184/issue-with-enumwindows). Я не знаю ни одного родного подхода PowerShell или .NET. –

ответ

0

Благодаря бекона предложению мне удалось найти решение, но если у вас есть какие-либо менее громоздким, чем это, пожалуйста, поделитесь:

<# 
.Synopsis 
Enumerieren der vorhandenen Fenster 
#> 

$TypeDef = @" 

using System; 
using System.Text; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 

namespace Api 
{ 

public class WinStruct 
{ 
    public string WinTitle {get; set; } 
    public int WinHwnd { get; set; } 
} 

public class ApiDef 
{ 
    private delegate bool CallBackPtr(int hwnd, int lParam); 
    private static CallBackPtr callBackPtr = Callback; 
    private static List<WinStruct> _WinStructList = new List<WinStruct>(); 

    [DllImport("User32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool EnumWindows(CallBackPtr lpEnumFunc, IntPtr lParam); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

    private static bool Callback(int hWnd, int lparam) 
    { 
     StringBuilder sb = new StringBuilder(256); 
     int res = GetWindowText((IntPtr)hWnd, sb, 256); 
     _WinStructList.Add(new WinStruct { WinHwnd = hWnd, WinTitle = sb.ToString() }); 
     return true; 
    } 

    public static List<WinStruct> GetWindows() 
    { 
     _WinStructList = new List<WinStruct>(); 
     EnumWindows(callBackPtr, IntPtr.Zero); 
     return _WinStructList; 
    } 

} 
} 
"@ 

Add-Type -TypeDefinition $TypeDef -Language CSharpVersion3 

[Api.Apidef]::GetWindows() | Where-Object { $_.WinTitle -like "*Word" } | Sort-Object -Property WinTitle | Select-Object WinTitle,@{Name="Handle"; Expression={"{0:X0}" -f $_.WinHwnd}} 
Смежные вопросы