Delphi:如何获取Edge浏览器查找窗口句柄并通过PostMessage发送文本
在Delphi中获取Edge查找窗口句柄并发送文本
Edge基于Chromium架构,窗口结构嵌套复杂,单个GetWindow调用无法定位到查找窗口。你需要递归遍历所有子窗口,匹配目标窗口的类名及特征来获取句柄,具体实现如下:
核心思路
- 从你已有的Edge浏览器控件句柄(
MyBrowserGd.EdgeBrowser.Handle)出发,递归遍历所有子窗口 - 匹配类名为
Chrome_WidgetWin_1的窗口,再通过标题或子控件进一步验证是否为查找窗口 - 找到查找窗口后,再定位其内部的输入编辑框,最后发送文本
实现代码
1. 递归查找查找窗口的函数
type TEnumChildProc = function(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; function GetEdgeFindWindow(hParent: HWND): HWND; var TargetHWND: HWND; function EnumChildWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; var szClassName: array[0..255] of Char; szWindowText: array[0..255] of Char; begin Result := True; // 默认继续遍历 // 获取当前窗口类名 GetClassName(hWnd, szClassName, SizeOf(szClassName)); if StrIComp(szClassName, 'Chrome_WidgetWin_1') = 0 then begin // 验证是否为查找窗口:匹配标题(中文环境为“查找”,英文为“Find”) GetWindowText(hWnd, szWindowText, SizeOf(szWindowText)); if (Pos('查找', szWindowText) > 0) or (Pos('Find', szWindowText) > 0) then begin TargetHWND := hWnd; Result := False; // 找到目标,停止遍历 Exit; end; end; // 递归遍历当前窗口的子窗口 EnumChildWindows(hWnd, @EnumChildWindowsProc, lParam); end; begin TargetHWND := 0; EnumChildWindows(hParent, @EnumChildWindowsProc, 0); Result := TargetHWND; end;
2. 调用函数并发送文本
var hFindWnd: HWND; hEditWnd: HWND; begin // 获取查找窗口句柄 hFindWnd := GetEdgeFindWindow(MyBrowserGd.EdgeBrowser.Handle); if hFindWnd = 0 then begin ShowMessage('未找到Edge查找窗口,请先打开查找面板(Ctrl+F)'); Exit; end; // 查找查找窗口内的输入编辑框 hEditWnd := FindWindowEx(hFindWnd, 0, 'Edit', nil); if hEditWnd <> 0 then begin // 设置查找文本 SetWindowText(hEditWnd, '你要查找的内容'); // 可选:发送回车键触发查找 PostMessage(hEditWnd, WM_KEYDOWN, VK_RETURN, 0); PostMessage(hEditWnd, WM_KEYUP, VK_RETURN, 0); end else ShowMessage('未找到查找输入框'); end;
注意事项
- 必须确保Edge的查找面板已经打开(用户手动按Ctrl+F,或者你通过代码发送
Ctrl+F快捷键打开),否则无法找到目标窗口 - Chromium版本更新可能微调窗口类名,但
Chrome_WidgetWin_1是长期稳定的类名,无需频繁修改 - 如果系统语言非中英,需要调整标题匹配的关键词,或者改为检查子控件组合(比如同时存在
Edit和Button控件)来验证查找窗口
内容的提问来源于stack exchange,提问作者Robert Duchene




