如何操作另一个Delphi进程中WebView4Delphi的WebView2内容?
跨进程访问WebView4Delphi的WebView2组件
问题描述
需要跨进程访问另一个基于WebView4Delphi组件开发的Delphi程序中的WebView2,实现填充网页表单、点击按钮的操作。目前已通过窗口查找代码定位到网页所在窗口,但无法获取WebView2接口,现有窗口查找代码如下:
MainWindow := FindWindow('TFWebViewExplorer.UnicodeClass', nil); if MainWindow = 0 then Exit; LWnd := FindWindowEx(MainWindow, 0, 'TWVWindowParent', nil); if LWnd <> 0 then LWnd := FindWindowEx(LWnd, 0, 'Chrome_WidgetWin_0', nil); if LWnd <> 0 then LWnd := FindWindowEx(LWnd, 0, 'Chrome_WidgetWin_1', nil); if LWnd <> 0 then LWnd := FindWindowEx(LWnd, 0, 'Intermediate D3D Window', nil);
目标是获取TWVBrowserBase类实例,调用其ExecuteScript()方法运行JavaScript实现需求。
可行解决方案
1. 目标进程主动暴露通信能力
在使用WebView4Delphi的目标程序中添加跨进程通信逻辑,接收外部指令后执行对应操作:
- 注册Windows自定义消息,外部程序通过
SendMessage发送包含JS脚本的消息,目标进程收到后调用TWVBrowserBase.ExecuteScript()执行 - 采用命名管道、共享内存等IPC机制,外部程序将需要执行的JS脚本传递到目标进程,由目标进程内部调用WebView2接口执行
2. 启用WebView2远程调试协议
WebView2基于Chromium内核,支持远程调试协议,可通过该协议跨进程控制WebView2:
- 在目标程序初始化WebView2时,设置调试端口参数:
var LEnvOptions: TCoreWebView2EnvironmentOptions; begin LEnvOptions := TCoreWebView2EnvironmentOptions.Create; try LEnvOptions.AdditionalBrowserArguments := '--remote-debugging-port=9222'; // 初始化WebView2环境时传入该Options finally LEnvOptions.Free; end; end; - 外部程序通过HTTP请求
http://localhost:9222/json获取当前页面的调试目标信息,建立WebSocket连接后发送调试命令执行JS脚本
3. DLL注入目标进程
通过DLL注入技术,在目标进程空间内直接获取TWVBrowserBase实例:
- 编写注入DLL,在DLL入口遍历目标进程的VCL组件树,定位到
TWVBrowserBase类型的组件实例 - 获取实例后直接调用其
ExecuteScript()方法,执行所需的JavaScript代码
注意事项
- 跨进程操作需确保程序具备足够权限,避免因权限不足导致操作失败
- 使用远程调试协议时,需注意端口的安全性,防止未授权访问
- DLL注入需熟悉Delphi内存操作与VCL组件模型,避免破坏目标进程的稳定性
内容的提问来源于stack exchange,提问作者tombones
相关产品推荐
相关产品推荐

