① vb6使用Webbrowser1,點擊網頁裡面的按鈕,觸發網頁的js時,觸發vb中定義的事件
看了抄你的提問我也有襲了疑問:
1.htm有幾個?
Set mICustomDoc = Me.WebBrowser1.Document
mICustomDoc.SetUIHandler Me
這個代碼裡面,SetUIHandler方法來自何方?可能是你自己寫了個加強型類模塊?
看到「(這個頁面結構我是無許可權改動的,我只有許可權改動vb中的代碼)」這句我就望而卻步了,我的辦法是廢棄掉HTM文件里的所有執行代碼,HTM文件只負責布局,執行代碼都集中到VB程序里。
還有個辦法是找到mICustomDoc.SetUIHandler Me的逆操作,文本框(如果能)取得焦點,就採取該逆操作,使得文本框能夠輸入。文本框取得焦點的時候最好添加個遮布來屏蔽頁面其他元素,如果這樣,文本框也就不如沒有好。
② webbrowser 執行網頁中的JS
在界面上拖入QAxWidget並指定控制項為{8856F961-340A-11D0-A96B-00C04FD705A2},這個值可以通過OleView.exe查到然後通過IHTMLWindow2介面的execScript方法執行java
在界面上拖入QAxWidget,注意這里不建議直接在UI設計界面指定控制項,否則可能引起QtCreator崩潰
建議在代碼中動態設置,如:
ui->axWidget->setControl("Shell.Explorer"); ui->axWidget->dynamicCall("Navigate(QString)", "C:/1.html");當然,上面的"C:/1.html"是我測試的頁面
這里的辦法是通過IHTMLWindow2介面的execScript方法執行JavaScript函數。可惜的是這個方法不支持函數返回值
#include <MsHTML.h> { QAxObject *document = ui->axWidget->querySubObject("Document"); IHTMLDocument2 *doc2; document->queryInterface(QUuid(IID_IHTMLDocument2), (void**)&doc2); if (doc2) { IHTMLWindow2 *win2 = nullptr; if (doc2->get_parentWindow(&win2) == S_OK) { BSTR s1 = SysAllocString(L"Test()"); BSTR s2 = SysAllocString(L"JavaScript"); VARIANT ret; win2->execScript(s1, s2, &ret); SysFreeString(s2); SysFreeString(s1); } } }
JavaScript函數如下
<script language="javascript" type="text/javascript"> function Test() { alert("你調用了全局函數Test"); } </script>
③ C# 的cefsharp 里的ChromiumWebBrowser執行js
你可以把這個js 寫在網頁載入的事件上,或者在生成窗口的時候帶入一個js文件,他也會去執行,用這個來封裝應用程序會導致安裝包很大慎用。