jj119120 发表于 2017-2-20 12:31:16

[已解决]如何在内嵌IE窗口中获取点击的链接

本帖最后由 jj119120 于 2017-2-22 18:57 编辑

RT困扰很久了   搜索了一下论坛   没有太适用的方法

之前的方法是借鉴 风行者 的 内嵌IE不弹出新窗口[最新修改].au3在点击后等待跳转完毕 再获取当前网页链接   用sleep等待跳转完毕时间短了获取不到   时间长了 效率十分低下   不知道有没有更好的方法

已解决感谢各位的帮助感谢4#提供的源码现已解决问题   源码如下#include <IE.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
GUISetState()
Global $Text
$oIE = _IECreateEmbedded()
$url = "http://v.qq.com/tv/"
$dll = DllOpen("user32.dll")

$Form1 = GUICreate("Form1", 1280, 770, -1, -1)
$zhuye = GUICtrlCreateObj($oIE, 0, 0, 1280, 720)
$GUIEdit = GUICtrlCreateEdit("Test Log:" & @CRLF, 0, 725, 1280, 50)
GUISetState(@SW_SHOW)
$EventObject = ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents")   ;注册获取 IE对象产生的事件,有事件则调用后面的相关函数

If @error Then
        MsgBox(0, "AutoIt COM Test", _
                        "ObjEvent: Can't use event interface 'DWebBrowserEvents'. Error code: " & Hex(@error, 8))
        Exit
EndIf

_IENavigate($oIE, $url)

While 1
        $msg = GUIGetMsg()
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop

WEnd

$EventObject.Stop   ;告诉IE我们不想接收事件
$EventObject=0      ;杀死事件对象
$oIE=0            ;从内存中删除IE(不是必要的)

Func IEEvent_StatusTextChange($Text)
        GUICtrlSetData($GUIEdit, "IE Status text changed to: " & $Text & @CRLF, "append")   ;IE状态文本更改为
        If StringRegExp($Text, "http.+?\.qq\.com.+?cover\p{P}+(?<grp0>[^\.]+)\.htm", 0) = 1 Then   ;如果正则匹配
                If _IsPressed("01", $dll) Then    ;左键点击
                        MsgBox(32, "地址", $Text)
                EndIf
        EndIf
EndFunc   ;==>IEEvent_StatusTextChange

gaozhenghong 发表于 2017-2-20 14:25:29

新手,顶一下!

jj119120 发表于 2017-2-20 19:30:58

这么多人看   一个都做不到吗   说说思路也好嘛

Alam 发表于 2017-2-20 20:19:35

帮助文档里,COM参考带有一示例,如下:
(注意加注中文的两个地方) Example script, showing the usage of COM Event functions.
; Requires at least AutoIt beta version 3.1.1.104 !
;
; See also: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/internetexplorer.asp

; We use a very simple GUI to show the results of our Events.
#include "GUIConstantsEx.au3"
$GUIMain=GUICreate            ( "Event Test",       600,500 )
$GUIEdit=GUICtrlCreateEdit      ( "Test Log:" & @CRLF,10, 20, 580, 400)
$GUIProg=GUICtrlCreateProgress(                     10,5, 580,10)
$GUIExit=GUICtrlCreateButton    ( " Close ",          250, 450, 80,30)
GUISetState ()       ;Show GUI

; We prepare the Internet Explorer as our test subject
$oIE=ObjCreate("InternetExplorer.Application.1")
With $oIE
    .Visible=1
    .Top = (@DesktopHeight-400)/2
    .Height=400         ; Make it a bit smaller than our GUI.
    .Width=600
    .Silent=1         ; Don't show IE's dialog boxes
    $IEWnd=HWnd(.hWnd); Remember the Window, in case user decides to close it
EndWith

; We choose for a specific Internet Explorer interface 'DWebBrowserEvents' because the IE is subject
; to modifications by e.g. Visual Studio and Adobe Acrobat Reader. If you have IE-plugins installed,
; AutoIt might not be able to find the correct interface automatically.
; 关键....注册获取 IE对象产生的事件,有事件则调用后面的相关函数
$EventObject=ObjEvent($oIE,"IEEvent_","DWebBrowserEvents")
if @error then
   Msgbox(0,"AutoIt COM Test", _
    "ObjEvent: Can't use event interface 'DWebBrowserEvents'. Error code: " & hex(@error,8))
   exit
endif

; Now starting to load an example Web page.
$URL = "http://www.AutoItScript.com/"
$oIE.Navigate( $URL )         
sleep(1000)             ; Give it some time to load the web page

GUISwitch ( $GUIMain ); Switch back to our GUI in case IE stealed the focus

; Waiting for user to close the GUI.
While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE or $msg = $GUIExit Then ExitLoop
Wend

$EventObject.Stop   ; Tell IE we don't want to receive events.
$EventObject=0      ; Kill the Event Object
If WinExists($IEWnd) then $oIE.Quit   ; Close IE Window
$oIE=0            ; Remove IE from memory (not really necessary).

GUIDelete ()      ; Remove GUI

exit                ; End of our Demo.

; A few Internet Explorer Event Functions
; See also: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/webbrowser.asp

Func IEEvent_BeforeNavigate($URL, $Flags, $TargetFrameName, $PostData, $Headers, $Cancel)
;   Note: the declaration is different from the one on MSDN.
    GUICtrlSetData ( $GUIEdit, "BeforeNavigate: " & $URL & " Flags: " & $Flags & " tgframe: " & $TargetFrameName & " Postdat: " & $PostData & " Hdrs: " & $Headers & " canc: " & $Cancel& @CRLF, "append" )
EndFunc

Func IEEvent_ProgressChange($Progress,$ProgressMax)
    If $ProgressMax > 0 Then
      GUICtrlSetData($GUIProg, ($Progress * 100) / $ProgressMax )
    EndIf
EndFunc

Func IEEvent_StatusTextChange($Text)
    GUICtrlSetData ( $GUIEdit, "IE Status text changed to: " & $Text & @CRLF, "append" )
EndFunc

Func IEEvent_PropertyChange( $szProperty)
    GUICtrlSetData ( $GUIEdit, "IE Changed the value of the property: " & $szProperty & @CRLF, "append" )
EndFunc

Func IEEvent_DownloadComplete()
    GUICtrlSetData ( $GUIEdit, "IE has finished a navigation operation" & @CRLF, "append" )
EndFunc
;加载链接结束
Func IEEvent_NavigateComplete($URL)
;   Note: the declaration is different from the one on MSDN.
    GUICtrlSetData ( $GUIEdit, "IE has finished loading URL: " & $URL & @CRLF, "append" )
EndFunc

Func IEEvent_($EventName)
; This is an optional event function to catch non-defined events.
; The parameter contains the name of the event being called.
    GUICtrlSetData ( $GUIEdit, "Uncatched event: " & $EventName & @CRLF, "append" )
EndFunc

chamlien 发表于 2017-2-21 00:15:00

贴出源码看看

1361739590 发表于 2017-2-21 11:23:54

具体网址是什么获取哪个点击的连接

jj119120 发表于 2017-2-21 18:14:46

回复 5# chamlien #include <IE.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$oIE = _IECreateEmbedded()
$url = "http://v.qq.com"
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 1280, 720, -1, -1)
$zhuye=GUICtrlCreateObj($oIE, 0, 0, 1280, 720)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_IENavigate($oIE, $url)
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd

jj119120 发表于 2017-2-21 18:26:41

本帖最后由 jj119120 于 2017-2-21 18:28 编辑

回复 6# 1361739590




源码在一楼   任意一个网站都行点击网站内的链接    获取点击链接的网址

chamlien 发表于 2017-2-21 23:03:27

回复 7# jj119120


    先获取全部链接,再循环_IENavigate($oIE, $url),_IENavigate默认是等待网页加载完后再执行的,不用sleep

1361739590 发表于 2017-2-22 09:53:44

回复 8# jj119120


    你的目的中 需要打开这个点击的连接么?还是只要得到这个连接就可以了?
可以试试在点击后 不 等待跳转完毕 直接获取当前网页地址。

jj119120 发表于 2017-2-22 18:17:26

回复 4# Alam


    十分感谢   问题解决了

jj119120 发表于 2017-2-22 18:17:50

回复 5# chamlien


    谢谢   问题解决了   源码在一楼

jj119120 发表于 2017-2-22 18:18:02

回复 10# 1361739590


    谢谢   问题解决了   源码在一楼

xzf680 发表于 2017-2-24 11:29:54

遇到新的问题,那个左键点击事件判断是固定了,如拖动滚动条是按住了左键,如拖动时光标不小心移在链接上面就打开了链接,如何解决拖动时不打开链接的问题呢?滚动条的事件如何判断?

6FINGERS 发表于 2017-5-9 10:57:25

受用了,太了不起了
页: [1]
查看完整版本: [已解决]如何在内嵌IE窗口中获取点击的链接