C# 使用FindWindow和FindWindowEx查找窗体和控件
方法一:
函数:
// Find Window
// 查找窗体
// @para1: 窗体的类名 例如对话框类是"#32770"
// @para2: 窗体的标题 例如打开记事本 标题是"无标题 - 记事本" 注意 - 号两侧的空格
// return: 窗体的句柄
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string className, string windowName);
/// Find Window Ex
/// 查找窗体的子窗体
/// @para1: 父窗体的句柄 如果为null,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口
/// @para2: 子窗体的句柄 如果为null,从@para1的直接子窗口的第一个开始查找
/// @para3: 子窗体的类名 为""表示所有类
/// @para4: 子窗体的标题 为""表示要查找的窗体无标题 如空白的textBox控件
/// return: 子窗体的句柄
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
/// <summary>
/// 消息发送API
/// </summary>
/// <param name="hWnd">信息发往的窗口的句柄</param>
/// <param name="Msg">消息ID</param>
/// <param name="wParam">参数1</param>
/// <param name="lParam">参数2</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
如图想查询到此窗体并点击确定按钮代码如下:
// 执行操作 const int BM_CLICK = 0xF5; string windowName = "错误"; IntPtr maindHwnd = FindWindow(null, windowName); //获得选择框的句柄 if (maindHwnd != IntPtr.Zero) { IntPtr childHwndbtn = FindWindowEx(maindHwnd, IntPtr.Zero, null, "确定"); //获得按钮的句柄 if (childHwndbtn != IntPtr.Zero) { SendMessage(childHwndbtn, BM_CLICK, 0, 0); //发送点击按钮的消息 } else { MessageBox.Show("没有找到子窗口-按钮"); } } else { MessageBox.Show("没有找到窗口"); }
方法二(此方法为查找子窗体,并窗体置顶显示):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // Find Window // 查找窗体 // @para1: 窗体的类名 例如对话框类是"#32770" // @para2: 窗体的标题 例如打开记事本 标题是"无标题 - 记事本" 注意 - 号两侧的空格 // return: 窗体的句柄 [DllImport( "User32.dll" , EntryPoint = "FindWindow" )] public static extern IntPtr FindWindow( string className, string windowName); [DllImport( "user32.dll" , CharSet = CharSet.Auto)] private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags); 然后在formLoad中添加下面代码(此代码为查找错误窗体): Task t1 = new Task(() => { while ( true ) { IntPtr intPtr = FindWindow( null , "错误" ); LogHelper.WriteLog(GetType(), "获取错误窗体" ); if (( int )intPtr > 0) { LogHelper.WriteLog(GetType(), "获取错误窗体置顶" ); SetWindowPos(intPtr, -1, 0, 0, 0, 0, 1 | 2); //置顶 } Thread.Sleep(500); } }); t1.Start(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异