You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Delphi:如何获取Edge浏览器查找窗口句柄并通过PostMessage发送文本

在Delphi中获取Edge查找窗口句柄并发送文本

Edge基于Chromium架构,窗口结构嵌套复杂,单个GetWindow调用无法定位到查找窗口。你需要递归遍历所有子窗口,匹配目标窗口的类名及特征来获取句柄,具体实现如下:

核心思路

  1. 从你已有的Edge浏览器控件句柄(MyBrowserGd.EdgeBrowser.Handle)出发,递归遍历所有子窗口
  2. 匹配类名为Chrome_WidgetWin_1的窗口,再通过标题或子控件进一步验证是否为查找窗口
  3. 找到查找窗口后,再定位其内部的输入编辑框,最后发送文本

实现代码

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是长期稳定的类名,无需频繁修改
  • 如果系统语言非中英,需要调整标题匹配的关键词,或者改为检查子控件组合(比如同时存在EditButton控件)来验证查找窗口

内容的提问来源于stack exchange,提问作者Robert Duchene

火山引擎 最新活动