c#如何获取window窗口句柄及里面的内容?
网友回复
[DllImport("User32.dll",EntryPoint="FindWindow")] private static extern IntPtr FindWindow(string lpClassName,string lpWindowName); IntPtr hWnd = FindWindow(null,"微信");
捕获窗体内的文本,先看看相关的api
// 查找窗口 [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // 遍历窗口的所有子窗口,通过CallBack回调 [DllImport("user32.dll")] public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam); public delegate bool CallBack(IntPtr hwnd, int lParam); // 获取窗口的类名 [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); // 判断窗口是否可见 [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd); // 获取窗口文本长度 [DllImport("user32.dll")] public static extern int GetWindowTextLength(IntPtr hWnd); // 获取窗口文本,文本会塞入StringBuilder中,需要指明字符串最大长度nMaxCount [DllImport("User32.dll", EntryPoint = "GetWindowText")] private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount); // 给窗口发送消息 [DllImport("user32.dll", EntryPoint = "SendMessageA")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); // 给窗口发送消息,事件返回的数据通过Byte[]数组获得 [DllImport("user32.dll", EntryPoint = "SendMessageA")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, Byte[] lParam);完整代码
using System; using System.Runtime.InteropServices; using System.Text; public partial class WindowApiHelper { /// <summary> /// 尝试查找Error窗口并取出窗口文本 /// </summary> /// <returns></returns> public static string TryFindErrorWindowText() { string errorText = ""; // 查找标题为Error的窗口 IntPtr mainHandle = FindWindow(null, "Error"); if (mainHandle != IntPtr.Zero) { // 枚举子窗体,查找控件句柄 int i = EnumChildWindows(mainHandle, (h, l) => { StringBuilder sbr = new StringBuilder(); GetClassName(h, sbr, 255); string classname = sbr.ToString(); // 获取Edit子窗口 if ("Edit" == classname) { // 是否可见 if (IsWindowVisible(h)) { // 取出窗口文本 int textLen; textLen = SendMessage(h, WM_GETTEXTLENGTH, 0, 0); Byte[] byt = new Byte[textLen]; SendMessage(h, WM_GETTEXT, textLen + 1, byt); errorText = Encoding.Default.GetString(byt); // 关闭Error窗口 // SendMessage(h, WM_CLOSE , 0, 0); } } return true; }, 0); } return errorText; } /*--Windows API------------------------------------------------------------------------------------*/ [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam); public delegate bool CallBack(IntPtr hwnd, int lParam); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")] public static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("User32.dll", EntryPoint = "GetWindowText")] private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", EntryPoint = "SendMessageA")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); [DllImport("user32.dll", EntryPoint = "SendMessageA")] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, Byte[] lParam); const int WM_GETTEXT = 0x000D; const int WM_GETTEXTLENGTH = 0x000E; const int WM_CLOSE = 0x10; /*--Windows API------------------------------------------------------------------------------------*/ }