Jump to content
Sign in to follow this  
Herb191

_IENavigate_kill_popup function

Recommended Posts

Herb191

I use a lot of IE functions in my scripts and find it really annoying when I try to use _IENavigate to leave a webpage and I get popups saying things like "Are you sure you want to leave this page?". I searched the forum and could not find a solution that I liked so I created this function. I hope others find it useful and as always I am open to any constructive criticism (that's how we learn). :D

_ProcessGetParent() function taken from MrCreatoR's post (thanks MrCreatoR)

#include <IE.au3>

;This page currently has displays a popup when you try to navigate away from the page
$any_url = "aquaponics4you.com"
;$any_url = "yahoo.com"

$oIE = _IECreate($any_url)
$oIE = _IENavigate_kill_popup($oIE, "Google.com")

Func _IENavigate_kill_popup($IEObject, $URL, $visible = 1, $wait = 1)
    If Not IsObj($IEObject) Then Return SetError(1, 0, 0)
    $closed_process = False

    ;gets the IE process
    $pid = WinGetProcess(_IEPropertyGet($IEObject, "hwnd"))

    ;Trys to navigate to URL
    _IENavigate($IEObject, $URL, 0)

    ;Gets list of all process
    $aProc_List = ProcessList()

    ;Checks to see if any process were opened by the IE window. If process where opened it closes them and the IE window.
    For $i = 1 To $aProc_List[0][0]
        If _ProcessGetParent($aProc_List[$i][1]) = $pid Then
            ProcessClose($aProc_List[$i][1])
            $closed_process = True
        EndIf
    Next

    ;will create a new IE with old IE object varable if it no longer exists.
    If $closed_process = True Then
        $IEObject = _IECreate($URL, 0, $wait)
        Return $IEObject
    Else
        If $wait = 1 Then _IELoadWait($IEObject)
        Return $IEObject
    EndIf
EndFunc   ;==>_IENavigate_stop_pop

Func _ProcessGetParent($iPID)
    Local $wbemFlagReturnImmediately = 0x10
    Local $wbemFlagForwardOnly = 0x20
    Local $colItems = ""
    Local $strComputer = "localhost"

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    If IsObj($colItems) Then
        For $objItem In $colItems
            If $objItem.ProcessID = $iPID Then Return $objItem.ParentProcessID
        Next
    EndIf

    Return SetError(1, 0, 0)
EndFunc   ;==>_ProcessGetParent
Edited by Herb191

Share this post


Link to post
Share on other sites
Herb191

I found some errors in my code so I changed the function so that it would work right.

#include <IE.au3>

;This page currently has displays a popup when you try to navigate away from the page
$any_url = "http://aquaponics4you.com/"
;$any_url = "http://www.yahoo.com/"

$oIE = _IECreate($any_url)
$oIE = _IENavigate_kill_popup($oIE, "http://www.google.com/")

Func _IENavigate_kill_popup($IEObject, $URL, $visible = 1)
    If Not IsObj($IEObject) Then Return SetError(1, 0, 0)
    $closed_process = False

    $list_of_windows = WinList()

    ;Trys to navigate to URL
    _IENavigate($IEObject, $URL, 0)
    _IELoadWait($IEObject, 0, 5000)

    If _IEPropertyGet($IEObject, "locationurl") <> $URL Then
        $closed_process = True
        $hwnd = _IEPropertyGet($IEObject, "hwnd")

        Do ;will loop until the IE window can close
            If WinClose($hwnd) = 1 And WinExists($hwnd) = 1 Then
                $list_of_windows2 = WinList()
                For $i = 1 To $list_of_windows2[0][0]
                    For $i2 = 1 To $list_of_windows[0][0]
                        $win_existed_before = False
                        If $list_of_windows2[$i][1] = $list_of_windows[$i2][1] Then
                            $win_existed_before = True
                            ExitLoop
                        EndIf
                    Next
                    ;if the window did not exist before it will close it
                    If $win_existed_before = False Then WinClose($list_of_windows2[$i][1])
                Next
            EndIf
        Until WinClose($hwnd) = 0
    EndIf

    ;will create a new IE object if old IE object made popups.
    If $closed_process = True Then
        $IEObject = _IECreate($URL, 0)
        Return $IEObject
    Else
        _IELoadWait($IEObject)
        Return $IEObject
    EndIf
EndFunc   ;==>_IENavigate_kill_popup

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • AndyS19
      By AndyS19
      I'm trying to implement a Ctl-F popup box that looks something like the one that Notepad uses, but I'm not havine much luck.  I intend to get it working, then beef up the popup's contents to add several checkboxes, buttons and radio boxes.
      What my example code does is to use InputBox(), but that's not what I want.
      Here is my test code:
      #include <Array.au3> #include <GUIConstantsEx.au3> #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 Opt("GUICloseOnESC", 1) Opt("GUIOnEventMode", 1) Opt('MustDeclareVars', 1) OnAutoItExitRegister("ExitStageLeft") Opt("WinTitleMatchMode", -2) Global $hGUI _Main() Func _Main() $hGUI = GUICreate("Test ^F", 300, 200) setupSpecialKeysHandlers() GUISetOnEvent($GUI_EVENT_CLOSE, "Event_GUIClose") GUISetState() While (1) Sleep(157) WEnd EndFunc ;==>_Main Func handle_CTRL_F_key() Local $str $str = InputBox("Search", "Enter the string to search for:") ConsoleWrite("+++: $str ==>" & $str & "<==" & @CRLF) EndFunc ;==>handle_CTRL_F_key Func ExitStageLeft() Exit (99) EndFunc ;==>ExitStageLeft Func Event_GUIClose() Exit (1) EndFunc ;==>Event_GUIClose Func setupSpecialKeysHandlers() Local $ar, $parts, $key, $handler, $id Local $aAccelKeys[1][2] ; Create a table of Special keys and their handlers $ar = StringSplit("", "") _ArrayAdd($ar, "^f - handle_CTRL_F_key ") ReDim $aAccelKeys[UBound($ar) - 1][2] ; Now, create $aAccelKeys array with the table data. ; For each entry, create a Dummy GUI and associate its ; ID with the special key. For $ndx = 1 To UBound($ar) - 1 $parts = StringSplit($ar[$ndx], "-", 2) $key = StringStripWS($parts[0], 8) $handler = StringStripWS($parts[1], 8) $id = GUICtrlCreateDummy() $aAccelKeys[$ndx - 1][0] = $key $aAccelKeys[$ndx - 1][1] = $id GUICtrlSetOnEvent($id, $handler) Next GUISetAccelerators($aAccelKeys) ; Setup the Special keys hooks EndFunc ;==>setupSpecialKeysHandlers  
    • help_me_please
      By help_me_please
      Hello forum world,
      I am having an issue with a popup window displaying after selecting something using the ControlCommand( ) function.
      I am able to select the desired item from the dropdown list using the control command function but a popup window opens immediately after, not allowing the control command function to finish.
      Such as:
      ConsoleWrite("Before ControlCommand" & @CRLF)
      ControlCommand($Win_Name, "", $ID, "SelectString", $DropItemName)
      ConsoleWrite("After ControlCommand" & @CRLF)
       
      ^^^^
      So in the console I can get the "Before...", then the ControlCommand executes the selection of the dropdown menu.  Popup window opens
      But since there is a popup, I can not get the "After..." statement to write to the console. 
      This is where I am stuck, as I can not execute another command to close the popup window.
       
      Send help, oh gracious autoit forum.  
    • Bensdb
      By Bensdb
      Hi - 
      I am simply trying to loop through pages of a website using _IENavigate..
      For some reason it freezes on page 2, rather than continuing through the loop.
      I have been trying to fix this for hours and I am really at the end of my tether with it...
      Any experienced Autoit'ers fancy having a bash for me? 
      I've tried sleep, messing with the IE.au3 file, rewriting the whole script to try to target the link after the active link in the nav menu....EVERYTHING.
      Just a beginner who is thoroughly stuck after hours of trying.
       
      #include <MsgBoxConstants.au3> #include <IE.au3> #include <Array.au3> #include <File.au3> Global $oIE = _IECreate("http://www.jobhero.ph/resume-search/all/1") For $i = 2 To 5 ; THIS IS WHERE AUTOIT LOSES THE CONNECTION TO BROWSER AFTER ~2-3 URLS sleep(4000) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< added this to give time between navigations _IENavigate($oIE, "http://www.jobhero.ph/resume-search/all/" & $i) If @error Then MsgBox(0, "Error", "There was a problem opening webpage!") EndIf Next  
    • lbsl
      By lbsl
      Greetings fellows,
       
      I have an issue that is bothering me for quite some time now (Since Autoit3 V3.3.8.0 and still not solved in 3.3.14.0) and i have not found any clue how to solve this particular problem regarding the control of popup-menus for specific controls. I have been searching using many keywords in the hope to find a similar posted issue either on the internet or here on this forum but did not yet stumbled upon it so i have no other option than to post the question (Sorry if there would exist an earlier topic).
      Below is an example that demonstrates the issue very clearly if you follow the steps to reproduce:
      #include <GuiMenu.au3> #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> $TestWindow1 = GUICreate("TestWindow1", 353, 277, 100, 80) $ListView1 = GUICtrlCreateListView("", 8, 8, 338, 262) $ListView1_0 = GUICtrlCreateListViewItem("TestItem1", $ListView1) $ListView1_1 = GUICtrlCreateListViewItem("TestItem2", $ListView1) $ListView1_2 = GUICtrlCreateListViewItem("TestItem3", $ListView1) GUISetState(@SW_SHOW) $TestWindow2 = GUICreate("TestWindow2", 353, 277, 100 + 400, 80) $ListView2 = GUICtrlCreateListView("", 8, 8, 338, 262) $ListView2_0 = GUICtrlCreateListViewItem("TestItem1", $ListView2) $ListView2_1 = GUICtrlCreateListViewItem("TestItem2", $ListView2) $ListView2_2 = GUICtrlCreateListViewItem("TestItem3", $ListView2) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") Local $MenuContext, $MenuContext2 Local $ahLVMenu[3] Local $ahLVMenu2[3] For $i = 0 To 2 $ahLVMenu[$i] = GUICtrlCreateDummy() $ahLVMenu2[$i] = GUICtrlCreateDummy() Next While 1 Local $nMsg = GUIGetMsg(1) Switch $nMsg[0] Case $GUI_EVENT_CLOSE If $nMsg[1] == $TestWindow2 Then GUISetState(@SW_HIDE, $nMsg[1]) Else Exit EndIf Case $ahLVMenu[0] ConsoleWrite("Dialog 1, Item 1" & @CRLF) Case $ahLVMenu[1] ConsoleWrite("Dialog 1, Item 2" & @CRLF) Case $ahLVMenu[2] ConsoleWrite("Dialog 1, Item 3" & @CRLF) Case $ahLVMenu2[0] ConsoleWrite("Dialog 2, Item 1" & @CRLF) Case $ahLVMenu2[1] ConsoleWrite("Dialog 2, Item 2" & @CRLF) Case $ahLVMenu2[2] ConsoleWrite("Dialog 2, Item 3" & @CRLF) EndSwitch WEnd Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $wParam Local $hWndFrom, $iIDFrom, $event, $tNMHDR, $hWndListView, $hWndListView2, $tInfo $hWndListView = $ListView1 $hWndListView2 = $ListView2 Local $tMsgFilter, $hMenu If Not IsHWnd($ListView1) Then $hWndListView = GUICtrlGetHandle($ListView1) If Not IsHWnd($ListView2) Then $hWndListView2 = GUICtrlGetHandle($ListView2) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $event = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndListView2 Switch $event Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button _LV_PopUpMenu2() ; Show popup context menu in Pharmacist article list EndSwitch Case $hWndListView Switch $event Case $NM_RCLICK ; Sent by a list-view control when the user clicks an item with the right mouse button _LV_PopUpMenu() ; Show popup context menu in Pharmacist article list EndSwitch EndSwitch $hWndFrom = 0 $iIDFrom = 0 $tNMHDR = 0 $hWndListView = 0 $hWndListView2 = 0 $tInfo = 0 $tMsgFilter = 0 $hMenu = 0 Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _LV_PopUpMenu() $MenuContext = _GUICtrlMenu_CreatePopup(40) _GUICtrlMenu_InsertMenuItem($MenuContext, 0, "Dialog 1, item 1", $ahLVMenu[0]) _GUICtrlMenu_InsertMenuItem($MenuContext, 1, "Dialog 1, item 2", $ahLVMenu[1]) _GUICtrlMenu_InsertMenuItem($MenuContext, 2, "Dialog 1, item 3", $ahLVMenu[2]) _GUICtrlMenu_TrackPopupMenu($MenuContext, $TestWindow1) _GUICtrlMenu_DestroyMenu($MenuContext) Return $GUI_RUNDEFMSG EndFunc ;==>_LV_PopUpMenu Func _LV_PopUpMenu2() $MenuContext2 = _GUICtrlMenu_CreatePopup(40) _GUICtrlMenu_InsertMenuItem($MenuContext2, 0, "Dialog 2, item 1", $ahLVMenu2[0]) _GUICtrlMenu_InsertMenuItem($MenuContext2, 1, "Dialog 2, item 2", $ahLVMenu2[1]) _GUICtrlMenu_InsertMenuItem($MenuContext2, 2, "Dialog 2, item 3", $ahLVMenu2[2]) _GUICtrlMenu_TrackPopupMenu($MenuContext2, $TestWindow2) _GUICtrlMenu_DestroyMenu($MenuContext2) Return $GUI_RUNDEFMSG EndFunc ;==>_LV_PopUpMenu2
      I have two window dialogs and two listview controls defined.
      Each listview control has its own popup menu and menu items.
      The code above works fine as long as both window dialogs are visible.
      You can right-click on each listview control and you get the designated menu popped up and if you select an item, the message for the specific item is being written into the console frame for it.
      However, if you close window 2, and attempt to trigger the options in the popup menu for window 1, you will notice that the notification messages are no longer being triggered at all.
      The popup menu becomes visible if you right-click the area and disappears if you select an option, but the control item no longer sends a notification which means that the attached events for the trapping are no longer being executed.
      Now if you switch the code snippets of the window frames being generated, you will notice you can achieve the same issue the other way round, which means that context menu item notifications are being received and trigger an event routine as long as window 1 would then in that case remain open.
      So it seems that whichever window is generated the last, that window somehow seems to get attached to the notification messages that are being send by the dummy controls for the context menu items.
      Do i misinterpret something here, is there a fix for this issue or did i encountered some kind of bug inside Autoit3?
       
    • careca
      By careca
      Hi there, this is supposed to work as a toast, called by functions and such. Kinda looks like the windows 10 notification, as intended,
      and the only problem is that i can't find a way to hide the taskbar button.
       
      Opt("WinSearchChildren", 1) #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> HotKeySet("{ESC}", "Terminate") Local $hParentWin, $hChildWin, $aMsg $hParentWin = GUICreate("Parent GUI", 200, 100) GUISetState(@SW_SHOW) $hChildWin = GUICreate("Child GUI", 360, 65, @DesktopWidth + 400, @DesktopHeight - 106, $WS_POPUP, $WS_EX_APPWINDOW+$WS_EX_TOPMOST) GUISetBkColor(0x1F1F1F, $hChildWin) GUICtrlCreatePic(@ScriptDir&'\Info.bmp', 8, 8, 48, 48) $Title = GUICtrlCreateLabel('Title', 70, 10, 250, 25) GUICtrlSetFont($Title, 14, 900, 0, 'Arial', 5) GUICtrlSetColor($Title, 0xFFFFFF) GUICtrlSetBkColor($Title, 0x1F1F1F) $Text = GUICtrlCreateLabel('Text', 70, 35, 250, 25) GUICtrlSetFont($Text, 10, 600, 0, 'Arial', 5) GUICtrlSetColor($Text, 0x707070) GUICtrlSetBkColor($Text, 0x1F1F1F) GUISetState(@SW_SHOW) Show() Func Show() WinMove($hChildWin, '', @DesktopWidth - 360, @DesktopHeight - 106, 360, 65, 1) ConsoleWrite('Show - ' & @MSEC & @CRLF) EndFunc ;==>Show Func Hide() WinMove($hChildWin, '', @DesktopWidth + 400, @DesktopHeight - 106, 360, 65, 1) ConsoleWrite('Hide - ' & @MSEC & @CRLF) EndFunc ;==>Hide While 1 Sleep(300) WEnd Func Terminate() Exit EndFunc ;==>Terminate  
      Info.bmp
×