Delphi TWebBrowser[12] 操作Alert对话框(禁用、获取)

Delphi TWebBrowser[12] 操作Alert对话框(禁用、获取)

1、禁用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//常规方法
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  ((Sender as TWebBrowser).Document as IHtmlDocument2).parentWindow.execScript('window.alert=function(){}', 'javascript');
end;
//但对于含有框架的网页,而Alert对话框又是由子框架中的网页脚本弹出的,是无法拦截的。
//原因分析:虽然每个框架网页文档加载完成都会引发OnDocumentComplete事件,但传入的Sender参数始终是WebBrowser1本身,该事件响应代码对子框架中的网页文档无效。
//传入的第二个参数pDisp是包含了加载完成的框架的接口,通过这个接口可以获取框架网页的文档的引用,所以利用该参数进行处理就能真正拦截网页弹出的Alert对话框:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  iWB: IWebBrowser2;
begin
  if pDisp.QueryInterface(IID_IWebBrowser2, iWB) = s_ok then
  begin
    (iWB.Document as IHTmlDocument2).parentWindow.execScript('window.alert=function(){}','javascript');
  end;
end;

2、获取Alert 的值

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
28
29
30
31
//Alert弹出的网页对话框IE8的标题是“来自网页的消息”,而IE6由对话框的标题是“Microsoft Internet Explorer”,可以通过winAPI寻找对话框的方式
//以下代码没有按查找窗口标题方法获取窗口句柄。注意到不管IE哪个版本,IE窗口的类名都是“IEFrame”,而网页对话框的父窗口是IE窗口,以下根据父窗口的类名是不是IEFrame来判断窗口是否是网页对话框,
//以下代码点击网页弹出的Alert对话框和Confirm对话框的“确定”按钮,并用Label1控件显示网页对话框的消息内容:
 
var
  hIE, hDlg, hBtn, hStatic:HWND;
  Text: array[0..255] of char;
begin
  hDlg := GetWindow(Handle, GW_HWNDFIRST);
  While hDlg <> 0 do
  begin
    hIE := GetParent(hDlg);
    if GetClassName(hIE, Text, 255) > 0 then  //获取父窗口类名
      if Text = 'IEFrame' then //父窗口为IE窗口
       begin
         hBtn := FindWindowEx(hDlg, 0, nil, '确定'); //查看确定按钮
         if hBtn <> 0 then
         begin
           hStatic := FindWindowEx(hDlg, 0, 'Static', nil);
           hStatic := FindWindowEx(hDlg, hStatic, 'Static', nil);
           if GetWindowText(hStatic, Text, 255) > 0 then
             Label1.Caption := Text;
           Sleep(100);
           SendMessage(hBtn, $00F5, 0, 0); //第一次点击使确定按钮获取焦点
           Sleep(100);
           SendMessage(hBtn, $00F5, 0, 0); //第二次点击击中确定按钮
         end;
       end;
    hDlg:=GetWindow(hDlg,GW_HWNDNEXT);
  end;
end;

 

  

 

  

创建时间:2020.11.23  更新时间:

 

posted on   滔Roy  阅读(313)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示