7*24小时应急电话:15927160396
首页 新闻资讯 技术文章
使用webbrowser时,js弹出对话框的自动处理

问题的提出:

使用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), IntPtr.Zero);//关闭
//PostMessage(hwnd,WM_KEYDOWN,VK_RETURN,0×001C0001); //回车
//PostMessage(hdlg, WM_COMMAND, IDOK, 0);
PostMessage(PopupHandle, 0×111, new IntPtr(1), IntPtr.Zero);
}
}

如果用VB,核心代码如下:

PostMessage(PopupHandle, &H100, New IntPtr(&HD), New IntPtr(&H1C0001)) //回车
PostMessage(PopupHandle, &H111, New IntPtr(1), IntPtr.Zero) //IDOK

声明部分:

<DllImport(“user32.dll”)> _

Private Shared Function GetLastActivePopup(ByVal hwnd As IntPtr) As IntPtr

End Function
<DllImport(“user32.dll”, SetLastError:=True, CharSet:=CharSet.Auto)> _

Private Shared Function PostMessage( _

ByVal hWnd As IntPtr, _

ByVal Msg As Integer, _

ByVal wParam As IntPtr, _

ByVal lParam As IntPtr) As Boolean

End Function

程序部分:

tmrPopCheck.Stop()
‘GET HANDLE OF ACTIVE IE POPUP (AKA JS ALERT)
Dim PopupHandle As IntPtr = GetLastActivePopup(Me.Handle)

‘IF THE POPUP HANDLE IS NOT 0, AND IT IS NOT THE WB HANDLE
‘THEN SEND A WM_CLOSE MESSAGE (&H10) TO THE POPUP
‘SEE http://msdn2.microsoft.com/en-us/library/ms633507.aspx
‘FOR MORE INFO ON RETURN VALUE OF GetLastActivePopup

If (PopupHandle <> IntPtr.Zero) AndAlso (PopupHandle <> WB.Handle) Then
‘PostMessage(PopupHandle, &H10, New IntPtr(1), IntPtr.Zero)
‘PostMessage(PopupHandle, &H100, New IntPtr(&HD), IntPtr.Zero)
PostMessage(PopupHandle, &H111, New IntPtr(1), IntPtr.Zero)
End If

版权所有:武汉网福互联科技有限公司    鄂ICP备09022096号
业务QQ:23444550 客服QQ:267052100 电邮:23444550@qq.com  

鄂公网安备 42010602000905号

手机站二维码