Delphi通過IE視窗控制程式碼獲取網頁介面(IWebBrowser2)
主要用到的是MSAA(Microsoft Active Accessibility) 函式:ObjectFromLResult,該函式在動態連結庫 oleacc.dll 中定義。
uses SHDocVw, MsHtml, ActiveX;
type
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;
function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
MSG: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
Result := S_False;
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult');
if @ObjectFromLresult <> nil then begin
try
MSG := RegisterWindowMessage('WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK then
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
finally
FreeLibrary(hInst);
end;
end;
end;
呼叫例子,以下程式碼快速關閉所有開啟的IE視窗:
procedure TForm1.Button1Click(Sender: TObject);
var
hCurWindow, hMainWnd, hTabWnd, hCldWnd:HWnd; //視窗控制程式碼
WinClsName:array[0..255] of char;
IE1: IWebbrowser2;
begin
hCurWindow := GetWindow(Handle,GW_HWNDFirst); //獲取第一個視窗的控制程式碼
while hCurWindow<>0 do
begin
GetClassName(hCurWindow, @WinClsName, 255);
if String(WinClsName) = 'IEFrame' then
begin
hMainWnd := hCurWindow;
hCldWnd := hCurWindow;
hTabWnd := 0;
repeat //迴圈查詢所有選項卡
hTabWnd := FindWindowEx(hMainWnd, hTabWnd, 'Frame Tab', nil);
if hTabWnd <> 0 then hCldWnd := FindWindowEx(hTabWnd, 0, 'TabWindowClass', nil);
if hCldWnd <> 0 then hCldWnd := FindWindowEx(hCldWnd, 0, 'Shell DocObject View', nil);
if hCldWnd <> 0 then hCldWnd := FindWindowEx(hCldWnd, 0, 'Internet Explorer_Server', nil);
if hCldWnd <> 0 then if GetIEFromHWnd(hCldWnd, IE1) = S_OK then //獲取IWebBrowser2
begin
IE1.Quit; //關閉IE,也可以執行其他操作,呵呵
end;
until hTabWnd = 0;
end;
hCurWindow:=GetWindow(hCurWindow,GW_HWNDNEXT); //獲取下一個視窗的控制程式碼
end;
end;
相關文章
- 通過 gitlab 介面獲取程式碼提交記錄和改動行數Gitlab
- WPF通過附加屬性控制視窗關閉
- JavaScript 獲取網頁尾本程式碼內容JavaScript網頁
- QWebView獲取網頁原始碼WebView網頁原始碼
- 如何用C語言寫一個獲取視窗控制程式碼和其他資訊的小程式.C語言
- org.reflections 介面通過反射獲取實現類原始碼研究反射原始碼
- delphi 判斷類是否實現介面,獲取類實現的介面
- 通過程式碼掛上物理頁
- 通過HTTP Header控制快取HTTPHeader快取
- flutter 總結: 通過 GlobalKey 獲取介面任意元素座標尺寸Flutter
- 通過用shellcode獲取shell
- 關於父視窗獲取跨域iframe子視窗中的元素跨域
- python3中編碼如何獲取網頁?Python網頁
- WKWebView 獲取網頁高度,圖片點選檢視,網頁連結點選WebView網頁
- 想獲取JS載入網頁的源網頁的原始碼,不想獲取JS載入後的資料JS網頁原始碼
- 廣告彈窗/小視窗程式碼
- JavaScript 通過class獲取元素物件JavaScript物件
- Grails通過sessionId獲取session物件AISession物件
- 聊天平臺原始碼,通過MediaStore獲取縮圖模糊原始碼AST
- 視窗程式框架示例程式碼框架
- layui 子彈窗獲取父頁面的引數傳參UI
- springboot~通過面向介面程式設計對控制反轉IOC的理解Spring Boot程式設計
- js/jq 獲取網頁寬高JS網頁
- 127 PHP獲取網頁標題的3種實現方法程式碼例項PHP網頁
- 通過網址獲取ES最近10分鐘的資料量
- 獲取 NodeJS 程式退出碼NodeJS
- 通過身份證號碼獲取人的年齡和性別
- 介面測試中獲取的 token 值如何通過 des3 加密輸出S3加密
- 如何通過WinDbg獲取方法引數值
- 通過web url獲取檔案資訊Web
- android通過MediaProjection獲取螢幕內容AndroidProject
- Android 通過名稱獲取資源IDAndroid
- 通過反射獲取私有內部類物件反射物件
- Unity通過子物件獲取父物件例子Unity物件
- js 獲取可視介面的高度或寬度JS
- 前端獲取視訊編碼格式前端
- 使用CURL獲取速賣通詳情的API介面API
- 「無程式碼」高效的爬取網頁資料神器網頁
- layer父介面呼叫子彈窗的方法和獲取子彈窗的元素值總結