亚洲今日精彩视频_精品一级黄色_免费一级A片在现观看视频_8050福利视频 - 一级免费黄色片

7*24小時應(yīng)急電話:15927160396
首頁 新聞資訊 技術(shù)文章
使用webbrowser時,js彈出對話框的自動處理

問題的提出:

使用webbrowser控件自動執(zhí)行一些任務(wù)時,例如新增,修改,刪除這些操作,會有js對話框的確認(rèn)信息,例如:新增成功的消息對話框,修改,刪除的確認(rèn)對話框,必須選擇是或者否。由于對話框是模態(tài)的(MODAL)如果不處理,程序就會停住,不能執(zhí)行。

解決方案分析:

可以通過windows發(fā)送消息,讓對話框消失,相當(dāng)于鼠標(biāo)或者鍵盤點擊。

對于消息對話框解決的方案比較多:

1 關(guān)閉窗口的消息,簡單,直接關(guān)閉之;

2 發(fā)送鍵盤消息,因為只有一個按鈕,默認(rèn)按鈕就是他,模擬鍵盤的回車鍵,空格鍵或者ESC鍵,消息對話框也會關(guān)閉;

3 發(fā)送按鈕消息,直接模擬IDOK消息就可以了;
確認(rèn)對話框如果選擇是,那么采用第二個和第三個方案就可以。

要解決的關(guān)鍵技術(shù)問題就是如何調(diào)用windows api函數(shù),并且由于程序已經(jīng)在彈出對話框的地方停住了,等待用戶響應(yīng),程序怎么重新獲得控制權(quán),繼續(xù)執(zhí)行。

程序解決方案:

第一個問題:C#聲明windows API

檢索到這樣的文章在C#中通過 P/Invoke 調(diào)用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”); //這句話會彈出一個確認(rèn)對話框

第三個問題:關(guān)鍵代碼

說明:幾個常用的變量數(shù)值作為備忘

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);//關(guān)閉
//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

版權(quán)所有:武漢網(wǎng)福互聯(lián)科技有限公司    鄂ICP備09022096號
業(yè)務(wù)QQ:23444550 客服QQ:267052100 電郵:23444550@qq.com  

鄂公網(wǎng)安備 42010602000905號

手機(jī)站二維碼