dnbj2010 发表于 2010-6-21 10:36:07

AU3浏览器的毛病-总是跳出IE窗口

本帖最后由 dnbj2010 于 2010-7-2 22:55 编辑

AU3浏览器的毛病-总是跳出IE窗口-UDF高手们不要睡着了!!!
在下一名AU3的爱好者,新人新手。在论坛里也还看了不少AU3浏览器的例子,试验了许多代码。
可一个最关键的问题始终无法解决:即点击网页链接后打开的网页总是跳出在IE窗口中显示,不能做到在AU3的GUI窗口内显示。
头些天逛贴子时看到guland版主说易语言可以做到,就去找来看了一下。还真是这样。
http://www.autoitx.com/forum.php?mod=viewthread&tid=14316&sid=VzAdte
下面将两个运行程序都传上来,供大家参考对比。
大家可以留意易语言浏览器,打开多个网页后,可以很简洁的在一个窗口内多标签显示。还可以留意打开多个网页后,去本机的Temporary Internet Files
,可以看到里面留下浏览网页的痕迹,这说明易语言浏览器也是调用IE浏览器来做的。没理由啊,同样是调用IE,AU3也应该可以做到的,关键还要看有没有高手弄出这个UDF来了。
这么久了,AU3的UDF高手们,不要睡着了。
程序在附件中下载。
AU3浏览器代码来自论坛。
代码如下:#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <IE.au3>

Global $Title = "AU3浏览器", $URLClick = 0

_IEErrorHandlerRegister()
$oIE = _IECreateEmbedded()

$Form1 = GUICreate($Title, 800, 600, -1, -1, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))
$Button1 = GUICtrlCreateButton("后退", 0, 0, 49, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$Button2 = GUICtrlCreateButton("前进", 48, 0, 49, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$Button3 = GUICtrlCreateButton("刷新", 96, 0, 49, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$Button4 = GUICtrlCreateButton("主页", 144, 0, 49, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
GUICtrlCreateGraphic(197, 2, 2, 23, BitOR($SS_NOTIFY,$SS_SUNKEN))
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
GUICtrlCreateLabel("转到:", 202, 7, 31, 17)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$Input1 = GUICtrlCreateInput("http://site.baidu.com/", 234, 2, 521, 21)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Button5 = GUICtrlCreateButton("Go >", 758, 0, 41, 25, 0x01)
GUICtrlSetResizing(-1, $GUI_DOCKTOP+$GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
GUICtrlCreateObj($oIE, 0, 25, 800, 575)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKBOTTOM)
GUISetState(@SW_SHOW)

AdlibEnable("Timer")

_IENavigate($oIE, "http://site.baidu.com")

While 1
      $MouseInfo = GUIGetCursorInfo($Form1)
      If $MouseInfo = 1 Or $MouseInfo = 1 Then
                If $MouseInfo = $Input1 Then $URLClick = 1
      EndIf
      If $MouseInfo = 1 Or $MouseInfo = 1 Then
                If $MouseInfo <> $Input1 And $MouseInfo <> $Button5 Then $URLClick = 0
      EndIf
      Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        If MsgBox(1 + 32, $Title, "确定要退出?") = 1 Then
                              AdlibDisable()
                              Exit
                        EndIf
                Case $Button1
                        _IEAction($oIE, "back")
                Case $Button2
                        _IEAction($oIE, "forward")
                Case $Button3
                        _IEAction($oIE, "refresh")
                Case $Button4
                        _IENavigate($oIE, "http://site.baidu.com/")
                Case $Button5
                        _IENavigate($oIE, GUICtrlRead($Input1))
                        $URLClick = 0
      EndSwitch
WEnd

Func Timer()
      $WinPos = WinGetPos($Form1)
      If $WinPos < 415 Then WinMove($Form1, "", $WinPos, $WinPos, 415, $WinPos)
      If $WinPos < 61 Then WinMove($Form1, "", $WinPos, $WinPos, $WinPos, 61)
      If WinGetTitle($Form1) <> _IEPropertyGet($oIE, "title") Then
                If _IEPropertyGet($oIE, "title") = "" Then
                        WinSetTitle($Form1, "", _IEPropertyGet($oIE, "locationurl") & " - " & $Title)
                Else
                        WinSetTitle($Form1, "", _IEPropertyGet($oIE, "title") & " - " & $Title)
                EndIf
      EndIf
      If GUICtrlRead($Input1) <> _IEPropertyGet($oIE, "locationurl") And $URLClick = 0 Then GUICtrlSetData($Input1, _IEPropertyGet($oIE, "locationurl"))
EndFunc

jaydancer 发表于 2010-6-23 16:43:47

感觉AU3的没什么用处,不知道能不能做出像易语言那样的浏览器

tryhi 发表于 2010-6-23 17:56:05

原来这个问题那么难,难怪我的提问帖都没人回答

pusofalse 发表于 2010-6-24 00:06:45

只76行代码就想写出一个浏览器?最起码要7600行。
的确如楼主所说,AU3的确没理由不能做到,关键看人的水平怎么样。
楼主貌似还没有独立思考过,从你能想到的任何可能会导致你测试失败的方面着手,一个一个排查吧,如果你仅用了10万次排查测试就找到了问题所在,那楼主的运气实在是太好了。
可能会对楼主有用:InternetExplorer Object

dnbj2010 发表于 2010-7-2 10:26:55

AU3浏览器- 如何不弹出IE窗口-简单试例

谢谢上面各位。
也谢谢pusofalse的建议。
{:1_506:}10万次排查 汗!我努力争取!可能俺智力不够,但俺很实诚。

在此也小小说一点个人看法:
在这里,俺只是个好奇的路人,游玩的票友,连蓝领都算不上,更不用说白领级的程序大师了。所求者在自已参与的同时,可以做一些小东西,带动一些人,这不是对AU3有利吗?本人同时也很满足很享受用AU3作一些小小的东西,付出一定的精力就可以获得了小小的成就感,这也是吸引新人的好方法啊。
何况目前浏览器的编程已不再是秘密,连微软都不再向以前那样高高在上,死抱着一些函数不放。
眼下众人纷纷参与其中,都在利用控件与代码,DIY自已的浏览器来秀上一把,无可厚非吧。正因为有这些模块的放出,才使得几十万行的代码工作可以被几十行甚至更少的代码取代,这似乎不应算是懒惰羞耻而是进步吧。又何必拘泥于这些浏览器所需的函数与模块核心是否是其完全独自编写的呢?
(微软以前可能是想把函数卖给一些开发公司挣点钱,另也可能出于安全的考虑。)。
利用信息,资源的短缺以及对某些函数与接口的控制来达到技术的隔离,其实对国内自身编程能力的发展是不利的。这个话题说得有点大了,就此不提。
让我整个万千行"独立"的代码,委实太难。何况这万千行代码,不管用什么样的面向对象的语言与方法来写,归根结底还是要通过语法对接使用微软等公司提供的接口,API,函数库等这些核心模块吧,中国的程序员有几个敢挺起腰说完全是自已独创的东西。既然有了开放性的控件,库件这种现成的模块,又何必再花很多精力每个人都去写一把控件呢?做手机的厂家貌似也是用的别人开发的模块和集成芯片吧?
假如微软更新了这些接口与API,并且改变相关的语法表达方式,怕以此为生的编程师都会哭去了。
牛顿这么牛,也还要站在巨人肩上是吧?
在微软与英特尔实际上放出如此多的软硬件编程接入函数的前提下,许多人还是在利益需求下谴责微软封源,没意识到自已也在做着阻碍资源流通与积累的事。
呵呵!
一家之言,一已之见,偏狭谬论,大侠勿怪。高人勿怪。
闲话不提。上东西:AU3制作的可以不弹出IE的浏览器。 注:还不是太完美,很慢很烂。看看大家的意见,群策群力,看怎么来改进。

dnbj2010 发表于 2010-7-2 10:30:01

最上面顶上的那个标题不能改了吗?AU3浏览器的毛病----这个
标题不太合适,想改一下。

dnbj2010 发表于 2010-7-2 10:37:48

下面把代码贴上来:
一,监控IE的脚本#NoTrayIcon
#include <GUIConstants.au3>

While 1                                               
        sleep (1)                                 ;避免CPU占用率过高
        if ProcessExists("iexplore.exe") Then    ;在循环中监控IE进程,发现时
        sleep (500)                           ;设定一个延时,否则AU3有可能无法打开浏览器
        ProcessClose ("iexplore.exe")          ;终止系统 IE        
    EndIf
WEnd二,AU3-IE浏览器
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Local $i = 0 ,$t = 0, $n = 0
Opt("GUIOnEventMode", 1)
$Form0 = GUICreate("简单的AU3浏览器-初级试验品-功能还很不完善", 1024, 728, 0, 0)      ;主窗体
FileInstall("OIE.exe", @TempDir & "\")               ;将同目录下的IE监控程序设置存取,编译前请先编译监控文件OIE.exe,放置同目录下。
$Button1 = GUICtrlCreateButton("百度网址大全", 5, 30, 150, 30)
$Button81 = GUICtrlCreateButton("退出", 720, 0, 150, 30)
$Button80 = GUICtrlCreateButton("帮助", 720, 30, 150, 30)
GUICtrlSetOnEvent($Button1, "Activate1")                           ; 设置按钮控件单击事件
GUICtrlSetOnEvent($Button81, "Activate81")                         ; 设置按钮控件单击事件
GUISetState(@SW_SHOW)

$Form1 = GUICreate("首页", 1024, 650,8, 80,BitOR($WS_POPUP,$WS_CLIPSIBLINGS),BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST )) ;首页窗体
$WebBrowser1=ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($WebBrowser1, -12, 0, 1024, 750)                  ;对$WebBrowser1对象设置大小
$EventObject=ObjEvent($WebBrowser1,"IEEvent_","DWebBrowserEvents");设置通过UDF接收windows事件
$URL = "http://site.baidu.com"                                     ;自定义首页
$WebBrowser1.Navigate($URL)
GUISetState(@SW_SHOW)
RunWait (@TempDir & "\OIE.exe","",@SW_HIDE)                      ;运行IE监控

While 1                                               
                Sleep (1)
WEnd

;=====================================
Func IEEvent_NewWindow($URL)                               ; 接收IE的NewWindow事件。注意NewWindow2无效。有新窗口时发生,较早
;ProcessClose ("iexplore.exe")
GUISwitch ($Form1)                                       ;切换到此窗体下
$Form2 = GUICreate($URL, 1024, 650,8, 80,BitOR($WS_POPUP,$WS_CLIPSIBLINGS),BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST )) ;作为装载IE新页面的窗体
$WebBrowser2=ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($WebBrowser2, -12, 0, 1024, 750)   
$EventObject=ObjEvent($WebBrowser2,"IEEvent_","DWebBrowserEvents")
$WebBrowser2.Navigate($URL)
GUISetState(@SW_SHOW)

$n = $n + 1
If $n >= 4 Then
       WinKill ( $URL, "")
       Msgbox(0,"","对不起!本浏览器暂时只支持同时打开3个页面,5秒后将自动退出",5)
       ProcessClose ("OIE.exe")
       Activate81();警告后直接退出AU3
EndIf
EndFunc

;----------------------------------------
Func IEEvent_TitleChange($URL)                         ; 接收IE的TitleChange事件。获取网页标题。在可以获取title时发生,较晚。
$i = $i + 1
IniWrite(@TempDir & "\title.ini", "title"&$i,"", $URL)   ; 将所获得的URL标题写入配置ini文件
EndFunc

;----------------------------------------
Func IEEvent_NavigateComplete($URL)                ; 接收IE的TNavigateComplete事件。获取网页网址。比TitleChange事件稍早
$t = $t + 1
IniWrite(@TempDir & "\ini.ini", "title"&$t,"", $URL) ;将所获得的URL网址写入INI文件
EndFunc   ;==>IEEvent_NavigateComplete      ;目的通过按钮(标签)点击激活指定窗口,显示指定页

;----------------------------------------
Func IEEvent_StatusTextChange ()            ; 接收IE的IEEvent_StatusTextChange事件。触发自定义的wwwTab()事件 。更晚。
wwwTab()                                     ; 此事件中按钮需要从title.ini文件中获取显示文本,因此只能发生在title.ini写入之后
EndFunc

;====================================================================================
Func wwwTab()
        GUISwitch ($Form0)       
        $var2 = IniRead(@TempDir & "\title.ini", "title4", "", "")
        $var3 = IniRead(@TempDir & "\title.ini", "title6", "", "")
        $var4 = IniRead(@TempDir & "\title.ini", "title8", "", "")
        $var5 = IniRead(@TempDir & "\title.ini", "title10", "", "")
       
$Button2 = GUICtrlCreateButton($var2, 155, 30, 150, 30)
$Button3 = GUICtrlCreateButton($var3, 305, 30, 150, 30)
$Button4 = GUICtrlCreateButton($var4, 455, 30, 150, 30)
$Button5 = GUICtrlCreateButton($var5, 606, 30, 150, 30)

GUICtrlSetOnEvent($Button2, "Activate2")
GUICtrlSetOnEvent($Button3, "Activate3")
GUICtrlSetOnEvent($Button4, "Activate4")
GUICtrlSetOnEvent($Button5, "Activate5")

If $var2 = False Then
        GUICtrlSetState ( $Button2, $GUI_HIDE); 窗体隐藏$GUI_HIDE
Else                                        ; 否则
        GUICtrlSetState ( $Button2, $GUI_SHOW); 窗体显示$GUI_SHOW
EndIf
If $var3 = False Then
        GUICtrlSetState ( $Button3, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button3, $GUI_SHOW)
EndIf
If $var4 = False Then
        GUICtrlSetState ( $Button4, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button4, $GUI_SHOW)
EndIf
If $var5 = False Then
        GUICtrlSetState ( $Button5, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button5, $GUI_SHOW)
EndIf

EndFunc   ;==>wwwTab()自定义的窗体按钮标签事件

;=================================================================
Func Activate91()
        $var = IniRead(@TempDir & "\ini.ini", "title1", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate9

Func Activate2()
        $var = IniRead(@TempDir & "\ini.ini", "title2", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate2

Func Activate3()
        $var = IniRead(@TempDir & "\ini.ini", "title3", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate3

Func Activate4()
        $var = IniRead(@TempDir & "\ini.ini", "title4", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate4

Func Activate5()
        $var = IniRead(@TempDir & "\ini.ini", "title5", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate5

Func Activate1()
        WinActivate ("首页", "" )
EndFunc   ;==>Activate1

Func Activate80()
       GUISwitch ($Form0)
   $Form80 = GUICreate("帮助", 400, 300, 250, 214,$WS_CAPTION,$WS_EX_TOPMOST)
   $Labe80 = GUICtrlCreateLabel("报歉!东西很烂,功能有待各位开发!", 78,80, 333, 153)
   GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
   GUICtrlSetColor(-1, 0xFF0000)
       $Button88 = GUICtrlCreateButton("关闭", 88, 180, 150, 30)
       GUICtrlSetOnEvent($Button88, "Activate88")
   GUISetState(@SW_SHOW)
   Sleep (2000)
       WinKill ( "帮助", "" )
EndFunc   ;==>Activate80

Func Activate88()
        WinKill ( "帮助", "" )
EndFunc   ;==>Activate81

Func Activate81()
        qinkong1()
        qinkong2()
        ProcessClose ("OIE.exe")   
        Exit
EndFunc   ;==>Activate81

Func qinkong1()
        FileDelete(@TempDir & "\ini.ini")   ;直接删除
EndFunc   ;==>qinkong1()

Func qinkong2()
    FileDelete(@TempDir & "\title.ini")
       
EndFunc   ;==>qinkong2()

; end

dnbj2010 发表于 2010-7-2 10:43:30

对了,务必先编译好OIE.EXE文件,与本文件放置同一目录下。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Local $i = 0 ,$t = 0, $n = 0
Opt("GUIOnEventMode", 1)
$Form0 = GUICreate("简单的AU3浏览器-初级试验品-功能还很不完善", 1024, 728, 0, 0)      ;主窗体
FileInstall("OIE.exe", @TempDir & "\")               ;将同目录下的IE监控程序设置存取,编译前请先编译监控文件OIE.exe,放置同目录下。
$Button1 = GUICtrlCreateButton("百度网址大全", 5, 30, 150, 30)
$Button81 = GUICtrlCreateButton("退出", 720, 0, 150, 30)
$Button80 = GUICtrlCreateButton("帮助", 720, 30, 150, 30)
GUICtrlSetOnEvent($Button1, "Activate1")                           ; 设置按钮控件单击事件
GUICtrlSetOnEvent($Button81, "Activate81")                         ; 设置按钮控件单击事件
GUISetState(@SW_SHOW)

$Form1 = GUICreate("首页", 1024, 650,8, 80,BitOR($WS_POPUP,$WS_CLIPSIBLINGS),BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST )) ;首页窗体
$WebBrowser1=ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($WebBrowser1, -12, 0, 1024, 750)                  ;对$WebBrowser1对象设置大小
$EventObject=ObjEvent($WebBrowser1,"IEEvent_","DWebBrowserEvents");设置通过UDF接收windows事件
$URL = "http://site.baidu.com"                                     ;自定义首页
$WebBrowser1.Navigate($URL)
GUISetState(@SW_SHOW)
RunWait (@TempDir & "\OIE.exe","",@SW_HIDE)                      ;运行IE监控

While 1                                               
                Sleep (1)
WEnd

;=====================================
Func IEEvent_NewWindow($URL)                               ; 接收IE的NewWindow事件。注意NewWindow2无效。有新窗口时发生,较早
;ProcessClose ("iexplore.exe")
GUISwitch ($Form1)                                       ;切换到此窗体下
$Form2 = GUICreate($URL, 1024, 650,8, 80,BitOR($WS_POPUP,$WS_CLIPSIBLINGS),BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST )) ;作为装载IE新页面的窗体
$WebBrowser2=ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($WebBrowser2, -12, 0, 1024, 750)   
$EventObject=ObjEvent($WebBrowser2,"IEEvent_","DWebBrowserEvents")
$WebBrowser2.Navigate($URL)
GUISetState(@SW_SHOW)

$n = $n + 1
If $n >= 4 Then
       WinKill ( $URL, "")
       Msgbox(0,"","对不起!本浏览器暂时只支持同时打开3个页面,5秒后将自动退出",5)
       ProcessClose ("OIE.exe")
       Activate81();警告后直接退出AU3
EndIf
EndFunc

;----------------------------------------
Func IEEvent_TitleChange($URL)                         ; 接收IE的TitleChange事件。获取网页标题。在可以获取title时发生,较晚。
$i = $i + 1
IniWrite(@TempDir & "\title.ini", "title"&$i,"", $URL)   ; 将所获得的URL标题写入配置ini文件
EndFunc

;----------------------------------------
Func IEEvent_NavigateComplete($URL)                ; 接收IE的TNavigateComplete事件。获取网页网址。比TitleChange事件稍早
$t = $t + 1
IniWrite(@TempDir & "\ini.ini", "title"&$t,"", $URL) ;将所获得的URL网址写入INI文件
EndFunc   ;==>IEEvent_NavigateComplete      ;目的通过按钮(标签)点击激活指定窗口,显示指定页

;----------------------------------------
Func IEEvent_StatusTextChange ()            ; 接收IE的IEEvent_StatusTextChange事件。触发自定义的wwwTab()事件 。更晚。
wwwTab()                                     ; 此事件中按钮需要从title.ini文件中获取显示文本,因此只能发生在title.ini写入之后
EndFunc

;====================================================================================
Func wwwTab()
        GUISwitch ($Form0)       
        $var2 = IniRead(@TempDir & "\title.ini", "title4", "", "")
        $var3 = IniRead(@TempDir & "\title.ini", "title6", "", "")
        $var4 = IniRead(@TempDir & "\title.ini", "title8", "", "")
        $var5 = IniRead(@TempDir & "\title.ini", "title10", "", "")
       
$Button2 = GUICtrlCreateButton($var2, 155, 30, 150, 30)
$Button3 = GUICtrlCreateButton($var3, 305, 30, 150, 30)
$Button4 = GUICtrlCreateButton($var4, 455, 30, 150, 30)
$Button5 = GUICtrlCreateButton($var5, 606, 30, 150, 30)

GUICtrlSetOnEvent($Button2, "Activate2")
GUICtrlSetOnEvent($Button3, "Activate3")
GUICtrlSetOnEvent($Button4, "Activate4")
GUICtrlSetOnEvent($Button5, "Activate5")

If $var2 = False Then
        GUICtrlSetState ( $Button2, $GUI_HIDE); 窗体隐藏$GUI_HIDE
Else                                        ; 否则
        GUICtrlSetState ( $Button2, $GUI_SHOW); 窗体显示$GUI_SHOW
EndIf
If $var3 = False Then
        GUICtrlSetState ( $Button3, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button3, $GUI_SHOW)
EndIf
If $var4 = False Then
        GUICtrlSetState ( $Button4, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button4, $GUI_SHOW)
EndIf
If $var5 = False Then
        GUICtrlSetState ( $Button5, $GUI_HIDE)
Else
        GUICtrlSetState ( $Button5, $GUI_SHOW)
EndIf

EndFunc   ;==>wwwTab()自定义的窗体按钮标签事件

;=================================================================
Func Activate91()
        $var = IniRead(@TempDir & "\ini.ini", "title1", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate9

Func Activate2()
        $var = IniRead(@TempDir & "\ini.ini", "title2", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate2

Func Activate3()
        $var = IniRead(@TempDir & "\ini.ini", "title3", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate3

Func Activate4()
        $var = IniRead(@TempDir & "\ini.ini", "title4", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate4

Func Activate5()
        $var = IniRead(@TempDir & "\ini.ini", "title5", "", "")
        WinActivate ( $var, "" )
EndFunc   ;==>Activate5

Func Activate1()
        WinActivate ("首页", "" )
EndFunc   ;==>Activate1

Func Activate80()
       GUISwitch ($Form0)
   $Form80 = GUICreate("帮助", 400, 300, 250, 214,$WS_CAPTION,$WS_EX_TOPMOST)
   $Labe80 = GUICtrlCreateLabel("报歉!东西很烂,功能有待各位开发!", 78,80, 333, 153)
   GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
   GUICtrlSetColor(-1, 0xFF0000)
       $Button88 = GUICtrlCreateButton("关闭", 88, 180, 150, 30)
       GUICtrlSetOnEvent($Button88, "Activate88")
   GUISetState(@SW_SHOW)
   Sleep (2000)
       WinKill ( "帮助", "" )
EndFunc   ;==>Activate80

Func Activate88()
        WinKill ( "帮助", "" )
EndFunc   ;==>Activate81

Func Activate81()
        qinkong1()
        qinkong2()
        ProcessClose ("OIE.exe")   
        Exit
EndFunc   ;==>Activate81

Func qinkong1()
        FileDelete(@TempDir & "\ini.ini")   ;直接删除
EndFunc   ;==>qinkong1()

Func qinkong2()
    FileDelete(@TempDir & "\title.ini")
       
EndFunc   ;==>qinkong2()

; end

dnbj2010 发表于 2010-7-2 11:12:28

思路是这样的。
总是弹出IE窗器。先前整过一个无边框窗体的拉拽的例子,感觉跟IE的消息有很大关系。上网搜看资料。
又去下了一个VB的浏览器的源码,专门看他那个是怎样弄的。
结果发现VB那个是两个窗体,一个做主窗体,一个做网页装载窗体。利用WebBrowser控件做的。
返回来看AU3,既然第一次装载时都可以做到把IE页装入GUI,那么后面的网页也应该可以装入GUI。也就是一个GUI窗体装一个IE页。
有人问,那不是有许多个窗口了,其实只要把这些窗口都放到一个大窗体里面去,都处理成一样的外观格式,然后通过标签击切换,跟一个窗口的效果又有什么区别呢?反正IE自已都不怕弹出这么多窗口,有多少出来就装多少进去得了。唯一担心的就是代码的装载效率,因为没有现成的代码可以参考,所以搞出来的代码必然会有许多缺陷。
按照这个理解,俺通过WebBrowser控件事件相关资料的介绍,利用NewWindow事件首先成功的将新开网页装入了GUI窗体。但是IE的页也始终弹出。
又去查了些资料,有些资料说,遍历进程所有窗口,想办法获取这些IE窗口的句柄,然后将这些窗口一一隐藏。
折腾了很久,俺突然觉得这个思路有些误导。
大家看哈,GUI窗体上显示出网页,点击网页上的超链接,此时貌似是在AU3上面点,实则是在IE上点,因此IE将首先获得这个超链接的事件消息,第一时间就触发运行iexplore.exe进程了,等这个消息通过接口传到AU3上面时,就算遍历进程所有窗口(而且必须iexplore.exe已经进入进程启动窗口了),此时再去隐藏IE窗口,怕已是晚了。所以最根本的就是监控进程,一旦发现iexplore.exe,立刻禁止,而此时IE窗口还未来得及打开。
而超链接触发的消息却没有被禁止,传递到AU3上的接口时,AU3就可以进行对新开网页的装载了。

xsjtxy 发表于 2010-7-2 11:28:56

if StringInStr(RegRead("HKCR\HTTP\shell\open\command", ""), @ScriptFullPath) then
else
if msgbox(4,"默认浏览器","是否设置本浏览器为默认浏览器?") = 6 then RegWrite("HKCR\HTTP\shell\open\command", "", "REG_SZ", @ScriptFullPath)
endif

dnbj2010 发表于 2010-7-2 11:58:34

回复 10# xsjtxy

没用的,默认浏览器设为遨游就弹出遨游,设为腾迅TT就弹出腾迅TT。注册表只是告诉系统用哪个浏览器来装载网页,而实际上这些浏览器可能全部都使用了IE内核。IE的弹出是回应了超链接触发的事件,只要将这个触发引起的进程截住就行了。跟windows消息WebBrowser控件事件有紧密关系,跟注册表没啥关系。

dnbj2010 发表于 2010-7-2 12:18:22

说到遨游,想起来,比如默认双击网页是用IE打开,此时将遨游打开,最小化也可,然后再双击某网页链接,可以发现IE都不再弹出,双击的网页都装入了遨游里面去了。这证明什么?遨游浏览器在运行的时候,实际上也禁止了IE的进程,并且通过内部指令将打开网页的默认权转移到自已。退出遨游的时候再还原而已。
有次俺测试AU3的浏览器,很高兴,因为IE一直都不弹出了。正打算收工时,最后发现忘了关闭的遨游浏览器里面已然打开了不下30个的测试网页。当时的感觉想把这家伙给砸了。
这时想起pusofalse版主所说的"万次排查测试",而俺的这几十次上百次的折腾只不过是小菜一碟。人的精力是有限的,大家天天都研究1+1的话,估计这科学也没法发展了。

dnbj2010 发表于 2010-7-2 22:49:31

呵呵,找到改标题的地方了。记得以前曾经看到可以修改标题的嘛。
唉,代码看晕了,稀里糊涂的。
{:1_247:}

dnbj2010 发表于 2010-7-2 23:08:49

主题有点乱,算了,标题不改了,把后面的代码提了出来重新开了一个新贴。
页: [1]
查看完整版本: AU3浏览器的毛病-总是跳出IE窗口