ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10715|回复: 18

[求助] 弹出网页对话框后,怎样拿回控制权?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-7-29 16:51 | 显示全部楼层 |阅读模式
用VBA控制网页,弹出网页对话框后,系统等待,vbA程序不往下面运行(我的任务是继续往下运行,并进一步控制网页对话框),怎么办?难题!

查阅相关资料:
用webbrowser控件自动执行一些任务时,例如新增,修改,删除这些操作,会有js对话框的确认信息,例如:新增成功的消息对话框,修改,删除的确认对话框,必须选择是或者否。由于对话框是模态的(MODAL)如果不处理,程序就会停住,不能执行。
解决方案分析:
可以通过windows发送消息,让对话框消失,相当于鼠标或者键盘点击。
对于消息对话框解决的方案比较多:
1 关闭窗口的消息,简单,直接关闭之;
2 发送键盘消息,因为只有一个按钮,默认按钮就是他,模拟键盘的回车键,空格键或者ESC键,消息对话框也会关闭;
3 发送按钮消息,直接模拟IDOK消息就可以了;
确认对话框如果选择是,那么采用第二个和第三个方案就可以。
要解决的关键技术问题就是如何调用windows api函数,并且由于程序已经在弹出对话框的地方停住了,等待用户响应,程序怎么重新获得控制权,继续执行。
程序解决方案:
第一个问题:C#声明windows API
检索到这样的文章在C#中通过 P/Invoke 调用Win32 DLL(英文版本),这个问题基本就解决了,代码如下:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetLastActivePopup(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern Boolean PostMessage(IntPtr hWnd,int Msg, IntPtr wParam, IntPtr lParam);
GetLastActivePopup api说明参见:http://msdn2.microsoft.com/en-us/library/ms633507.aspx
PostMessage api说明参见:http://msdn.microsoft.com/en-us/library/ms644944%28VS.85%29.aspx
第二个问题:通过定时器控件,在弹出对话框前启动定时器,
timer2.Start();
webBrowser1.Document.All.GetElementsByName(“event_submit_do_delete”)[0].InvokeMember(“click”); //这句话会弹出一个确认对话框
第三个问题:关键代码
说明:几个常用的变量数值作为备忘
WM_KEYDOWN=100H
VK_RETURN=0DH
WM_COMMAND=111H
IDOK=1H
更多的变量可以访问 http://www.pinvoke.net/,这里的很全。
private void timer2_Tick(object sender, EventArgs e) {
timer2.Stop();
IntPtr PopupHandle = GetLastActivePopup(this.Handle);
//如果弹出对话框的句柄不是0(有对话框),并且对话框不是webbrowser,就送 WM_CLOSE(0×10)到这个对话框
if ((PopupHandle != IntPtr.Zero) || (PopupHandle != webBrowser1.Handle)) {
//PostMessage(PopupHandle, 0×10, new IntPtr(1), [...]

现在问题:

   VBA怎么用上面的方法? 用Application.OnTime。。。一样解决不了问题!

TA的精华主题

TA的得分主题

发表于 2010-7-29 17:13 | 显示全部楼层
等高人路过。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-7-30 18:07 | 显示全部楼层

相信办法总比困难多

请高手该出手时就出手,有回报!

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-6 11:11 | 显示全部楼层

自己想办法啦

不就是被卡住了吗,我再开个程序操作对话框。
用shell 运行这个小程序,这个程序用vb编。

突然想到,vba有多线程,能不能用呢。

两个办法都试一试。

高手别老在山上修炼,也现个身,给个意见啊!

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-8-28 21:51 | 显示全部楼层
第一种方法试验成功!思路决定出路。哈哈

有时间再试一下第二种。

TA的精华主题

TA的得分主题

发表于 2010-8-28 21:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-8-28 22:21 | 显示全部楼层
可以不用api的
a.html代码如下
<script language="javascript">
        alert("你好!!");
</script>

窗体代码
Private Sub CommandButton1_Click()
WebBrowser1.Navigate "file:///C:/Documents%20and%20Settings/Administrator/桌面/新建文件夹%20(13)/a.html" '根据a.html变地址
        
Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
SendKeys ("{enter} ")
End Sub

TA的精华主题

TA的得分主题

发表于 2010-8-28 22:27 | 显示全部楼层
楼上代码少了End Sub
  1. Private Sub CommandButton1_Click()
  2. WebBrowser1.Navigate "file:///C:/Documents%20and%20Settings/Administrator/桌面/新建文件夹%20(13)/a.html" '根据a.html变地址
  3. End Sub


  4. Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
  5. SendKeys ("{enter} ")
  6. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2010-8-28 23:32 | 显示全部楼层
sorry
理解错误,以为是打开网页就弹出消息框

TA的精华主题

TA的得分主题

发表于 2010-8-28 23:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
测试了下,下面这种js消息框,WebBrowser对它没任何反应
<html>
<script language="javascript">
function a()
{
   alert(text1.value);
}
</script>
<input id="text1" type="text" />
<input type="button" value="获取文本框输入内容" onclick="a()"/>
</html>
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-6 15:26 , Processed in 0.034589 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表