鸟人 发表于 2012-8-2 01:35:35

内嵌IE CommandStateChange 事件


#include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <IE.au3>
Opt("GUIResizeMode", 1)
Opt("GUIOnEventMode", 1)
Opt("TrayOnEventMode", 1)
Opt("TrayMenuMode", 3)
Global $Title = "Explorer"
Global $IEPage = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main", "Start Page")
_IEErrorHandlerRegister()
$oIE = _IECreateEmbedded()
$GUIMain = 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))
$hStatus = _GUICtrlStatusBar_Create($GUIMain)
GUICtrlSetResizing($hStatus, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)               
$BackButton = GUICtrlCreateButton("后退", 1, 2, 30, 21)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$ForwardButton = GUICtrlCreateButton("前进", 31, 2, 30, 21)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$PageButton = GUICtrlCreateButton("主页", 62, 2, 30, 21)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
GUICtrlCreateGraphic(95, 2, 2, 23, BitOR($SS_NOTIFY, $SS_SUNKEN))
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
GUICtrlCreateLabel("地址:", 102, 7, 31, 17)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$IEAdd = GUICtrlCreateCombo($IEPage, 134, 2, 400, 21)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
$OpenIE = GUICtrlCreateButton("刷新", 538, 2, 30, 21)
GUICtrlSetResizing($OpenIE, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT + $GUI_DOCKHCENTER)
GUICtrlCreateObj($oIE, 0, 25, 800, 556)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM)
$EventObject = ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents")
GUIRegisterMsg($WM_SIZE, "WM_SIZE")
GUISetOnEvent($GUI_EVENT_CLOSE, "gui")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "gui")
GUICtrlSetOnEvent($BackButton, "gui")
GUICtrlSetOnEvent($ForwardButton, "gui")
GUICtrlSetOnEvent($PageButton, "gui")
GUICtrlSetOnEvent($OpenIE, "gui")
GUISetState()
TraySetToolTip($Title)
$item_0 = TrayCreateItem("隐藏窗口")
TrayCreateItem("")
$item_1 = TrayCreateItem("清理内存")
TrayCreateItem("")
$item_2 = TrayCreateItem("退 出")
TraySetClick(8)
TraySetOnEvent(-13, "TrayEvent")
TrayItemSetOnEvent($item_2, "ExitScript")
TrayItemSetOnEvent($item_0, "TrayEvent")
TrayItemSetOnEvent($item_1, "TrayEvent")
GUISetState(@SW_SHOW)

_IENavigate($oIE, $IEPage)

While 1
        _ReduceMemory()
        Sleep(100)
WEnd

Func gui()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE, $GUI_EVENT_MINIMIZE
                        GUISetState(@SW_HIDE)
                        TrayItemSetText($item_0, "显示窗口")
                Case $BackButton
                        _IEAction($oIE, "back")
                Case $ForwardButton
                        _IEAction($oIE, "forward")
                Case $PageButton
                        _IENavigate($oIE, $IEPage)
                Case $OpenIE
                        _IENavigate($oIE, GUICtrlRead($IEAdd))
        EndSwitch
EndFunc   ;==>gui
Func TrayEvent()
        Switch @TRAY_ID
                Case -13, $item_0
                        If TrayItemGetText($item_0) = "隐藏窗口" Then
                                GUISetState(@SW_HIDE)
                                TrayItemSetText($item_0, "显示窗口")
                        Else
                                GUISetState(@SW_SHOW)
                                GUISetState(@SW_RESTORE)
                                TrayItemSetText($item_0, "隐藏窗口")
                        EndIf
                Case $item_1
                        $list = ProcessList()
                        For $i = 1 To $list
                                _ReduceMemory($list[$i])
                        Next
        EndSwitch
EndFunc   ;==>TrayEvent

Func IEEvent_StatusTextChange($Text)
        If $Text <> '' And StringLeft($Text, 4) = "http" Then $Text2 = $Text
        _GUICtrlStatusBar_SetText($hStatus, $Text)
EndFunc   ;==>IEEvent_StatusTextChange
Func IEEvent_TitleChange()
        If _IEPropertyGet($oIE, "title") = "" Then
                WinSetTitle($GUIMain, "", _IEPropertyGet($oIE, "locationurl") & " - " & $Title)
        Else
                WinSetTitle($GUIMain, "", _IEPropertyGet($oIE, "title") & " - " & $Title)
        EndIf
EndFunc   
Func IEEvent_CommandStateChange()
        GUICtrlSetData($IEAdd, _IEPropertyGet($oIE, "locationurl"))
EndFunc   ;==>IEEvent_DownloadComplete

Func ExitScript()
        $EventObject.Stop ; 不再接收事件
        $EventObject = 0 ; 关闭Event Object
        $oIE = 0 ; 清除内存
        GUIDelete()
        Exit
EndFunc   ;==>ExitScript
Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
        _GUICtrlStatusBar_Resize($hStatus)
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
Func _ReduceMemory($i_PID = @AutoItPID)
        If $i_PID <> -1 Then
                Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
                Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle)
                DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle)
        Else
                Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
        EndIf
        Return $ai_Return
EndFunc   ;==>_ReduceMemory


这是我用来挂网页游戏的,如何用 CommandStateChange 事件 实现“前进”“后退”变灰色,下面是找到的 CommandStateChange 事件是介绍 ,
CommandStateChange
CommandStateChange 是当Internet Explorer 想通知一个应用程序WebBrowser 命令状态已经改变时激发.当检测到Forward和Back 菜单项和按钮禁止或者使能时激发此事件.
CommandStateChange 事件有2个参数, Command 和 Enable。Command 输入参数将要改变状态的按钮的表示符,可以取值—CSC_NAVIGATEFORWARD 和 CSC_NAVIGATEBACK分别表示是Forward按钮项和Back项,每次导航发生, CommandStateChange 事件发生并告诉你Forward 或者 Back 菜单项以及按钮将使能或禁止. 举例来说, 如果没有Web页在当前导航后发生, Command 的值应该为 CSC_NAVIGATEFORWARD, 并且Enable 参数将等于VARIANT_FALSE.
第二个参数, Enable,如果命令可用(使能) 则为VARIANT_TRUE,如果禁止则值为VARIANT_FALSE.
为说明问题,我们看看代码。一下代码为定义事件接收的宏声明:
&nbsp;&nbsp;
&nbsp;
&nbsp;
                                                                                               
重要的一点是要通过WebBrowser控件的Create 方法来创建. ON_EVENT的第二个参数为你宿主的WebBrowser控件的IID.之前的例子中是NULL. 你必须为webbrowser控件声明一个ID 且用此 ID 创建实例.如果不这么做,事件将不会正确工作.
你可以在工程的任何文件定义此ID. (推荐在资源头文件resource.h.) 因为 最大的资源Id是32,779, 所以你可以如下定义WebBrowser 控件的ID:

#define IDC_WEBBROWSER&nbsp;35000
                       
此数高于resource.h中的任何资源ID, 因此可以确信ID 数字不会同采用ClassWizard添加的ID冲突.现在可以采用使用ID的 Create 方法来创建WebBrowser控件:

if (!m_webBrowser.Create(NULL, WS_CHILD|WS_VISIBLE,
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect(), this, IDC_WEBBROWSER))
                        {
                         return -1;
                        }
                                                                                               
                                                                               
下一步声明OnCommandStateChange 方法,该方法将在WebBrowser控件激发CommandStateChange 事件时被调用.可声明 如下:

void OnCommandStateChange(long lCommand, BOOL bEnable);
                                                                                               
                                                                               
在 OnCommandStateChange 方法的是现代码中, 设定表示Go Forward 或者 Go Back 想得导航菜单项的数据成员为使能或者禁止. 该书据成员将被UPDATE_COMMAND_UI 句柄使用。以下为OnCommandStateChange 方法实现:
                       
声明m_fForwardEnabled 和 m_fBackEnabled 数据变量为保护成员,类型为BOOL.同样在构造函数中谁的些数据成员为TRUE。.
现在当Go Forward和Go Back的菜单 UPDATE_COMMAND_UI被处理, 你可以直接进行设置. 下为示例代码:

鸟人 发表于 2012-8-2 01:49:35

还有个问题
要及时的还回当前打开页面的Url 到$IEAdd 里面该怎么做呢,
用这个

Func IEEvent_CommandStateChange()
      GUICtrlSetData($IEAdd, _IEPropertyGet($oIE, "locationurl"))
EndFunc

有时能改地址栏有时又不能改。

penguinl 发表于 2012-8-2 20:39:55

楼主的代码让人眼前一亮呀!能力有限,楼主问题我无法解答,见谅,见谅!

shiqu623 发表于 2012-8-3 08:40:18

回复 2# 鸟人


    没看明白你的问题,你的浏览器是要实现什么样的功能呢?IE内核的,和直接开IE有什么区别吗?

鸟人 发表于 2012-8-3 13:42:55

上班时间挂游戏用,其实也没多大区别,只是想知道如何用 CommandStateChange事件实现IE的 前进和后退 按钮成灰色 资料在上面,自己弄不出来。
页: [1]
查看完整版本: 内嵌IE CommandStateChange 事件