我想列出一个进程的所有窗口,比如 Word。这只给了我主窗口:
Get-Process winword |where {$_.mainWindowTItle} |format-table id,name,mainwindowtitle –AutoSize
Run Code Online (Sandbox Code Playgroud)
我还想在这里列出 Document1。
ID 名称 MainWindowTitle
1616 WINWORD Document2 - Microsoft Word
除了主窗口,还有其他方法可以访问窗口吗?
感谢 Bacon Bits 的建议,我设法找到了解决方案,但如果您有任何不那么麻烦的,请分享:
<#
.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}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3705 次 |
| 最近记录: |