那么窗口句柄又该怎么获取,一直找不到一个看得懂的语句。
获取窗口句柄也是容易的
EnumWindows
https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-enumwindows
private static void Main(string[] args)
{
List<Window> windows = Window.GetWindows();
foreach (Window window in windows)
{
Console.WriteLine(window);
}
Console.ReadKey();
}
public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam);
public class Window
{
private static List<Window> _windows = new List<Window>();
public string ClassName { get; set; }
public IntPtr HWnd { get; set; }
public string Title { get; set; }
public override string ToString()
{
return $"标题:{Title}\n" +
$"类名:{ClassName}\n" +
$"句柄:{HWnd}\n";
}
public static List<Window> GetWindows()
{
_windows.Clear();
EnumWindows(EnumWindowsFunc, IntPtr.Zero);
return _windows;
}
private static bool EnumWindowsFunc(IntPtr hwnd, IntPtr lParam)
{
if (hwnd == IntPtr.Zero)
{
return false;
}
else
{
if (IsWindow(hwnd) != 0)
{
StringBuilder buffer = new StringBuilder(256);
Window window = new Window
{
HWnd = hwnd
};
_ = GetClassNameW(hwnd, buffer, buffer.Capacity);
window.ClassName = buffer.ToString();
buffer.Clear();
_ = GetWindowTextW(hwnd, buffer, buffer.Capacity);
window.Title = buffer.ToString();
_windows.Add(window);
}
return true;
}
}
[DllImport("User32.dll")]
private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("User32.dll")]
private static extern int IsWindow(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
private static extern int GetClassNameW(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("User32.dll", CharSet = CharSet.Unicode)]
private static extern int GetWindowTextW(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
}