Jump to content
Phoenixx177

Embedding 3rd Party app and 2 browsers in GUI - I'm THIS close.

Recommended Posts

Phoenixx177

I have a script that is calling 2 browser windows in my GUI and loading up the appropriate URLs.  Tested alone it works fine.  I also have another script that launches a 3rd party application in the GUI.  When I try to modify my 2nd script so that it includes the two browser windows along with the GUI, the GUI loads but not the browser windows.  Can someone get a second set of eyes on the script below and tell me where my brain jumped track please?  Many Thanks.

#include <GUIConstants.au3>
#include <Constants.au3>
#include <windowsconstants.au3>
#include <IE.au3>

Global $oIE_google = _IECreateEmbedded()
Global $oIE_autoit = _IECreateEmbedded()

Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

$mainWindow = GUICreate("Embed Cmd", 1280, 780, 10, 10)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUISetState (@SW_SHOW)
GUIRegisterMsg(0xF, "WM_PAINT")

; create a borderless window that is a child to the main window
$embedWindow = GUICREATE("", 700, 400, 15, 15, $WS_POPUP, -1, $mainWindow)
Global $google = GUICtrlCreateObj($oIE_google, 10, 10, 1000, 300)
Global $autoit = GUICtrlCreateObj($oIE_autoit, 800, 10, 500, 300)
_IENavigate($oIE_google, "http://www.google.com")
_IENavigate($oIE_autoit, "http://www.bing.com")

DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $embedWindow, "hwnd", $mainWindow)




; launch the command prompt (black on white, without the operating system message)
$pid = run("C:\Program Files (x86)\Cisco\Router Manager\Router Administration.exe")
ProcessWait ($pid)
; get the handle of the cmd window as i cannot be certain that there will be only one instance of the cmd running with the same window title or class
$cmdHandle = _ProcessGetHWnd($pid, 2)
$hWndChild = $cmdHandle[1][1]
; make the command prompt window a child to the earlier created borderless child window
DllCall("user32.dll", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $embedWindow)
; resize the command prompt window so that its bolder and title bar are outside the borderless child window
;  giving the appearance of a borderless command prompt
WinMove($hWndChild, '', 10, 500, 485, 206)
;WinMove($hWndChild, '', 10, 500)
WinSetState($hWndChild, '', @SW_SHOW)
WinSetState($embedWindow, '', @SW_SHOW)
WinSetState($oIE_google, '', @SW_SHOW)
WinSetState($oIE_autoit, '', @SW_SHOW)

; inifinite event loop
While 1

; sleep for 100 milliseconds (to not hog the cpu)
    sleep(100)

; end of event loop
WEnd


Func CLOSEClicked()
; take care of things to do when exiting
    Winkill($hWndChild)
    Exit
EndFunc


Func WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    Sleep(100)
    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWnd, "ptr", 0, "int", 0)
EndFunc  ;==>WM_PAINT



;===============================================================================
;
; Function Name:    _ProcessGetHWnd
; Description:      Returns the HWND(s) owned by the specified process (PID only !).
;
; Parameter(s):     $iPid        - the owner-PID.
;                    $iOption    - Optional : return/search methods :
;                        0 - returns the HWND for the first non-titleless window.
;                        1 - returns the HWND for the first found window (default).
;                        2 - returns all HWNDs for all matches.
;
;                   $sTitle        - Optional : the title to match (see notes).
;                    $iTimeout    - Optional : timeout in msec (see notes)
;
; Return Value(s):  On Success - returns the HWND (see below for method 2).
;                        $array[0][0] - number of HWNDs
;                        $array[x][0] - title
;                        $array[x][1] - HWND
;
;                   On Failure    - returns 0 and sets @error to 1.
;
; Note(s):            When a title is specified it will then only return the HWND to the titles
;                    matching that specific string. If no title is specified it will return as
;                    described by the option used.
;
;                    When using a timeout it's possible to use WinWaitDelay (Opt) to specify how
;                    often it should wait before attempting another time to get the HWND.
;
;
; Author(s):        Helge
;
;===============================================================================
Func _ProcessGetHWnd($iPid, $iOption = 1, $sTitle = "", $iTimeout = 2000)
    Local $aReturn[1][1] = [[0]], $aWin, $hTimer = TimerInit()

    While 1

    ; Get list of windows
        $aWin = WinList($sTitle)

    ; Searches thru all windows
        For $i = 1 To $aWin[0][0]

        ; Found a window owned by the given PID
            If $iPid = WinGetProcess($aWin[$i][1]) Then

            ; Option 0 or 1 used
                If $iOption = 1 OR ($iOption = 0 And $aWin[$i][0] <> "") Then
                    Return $aWin[$i][1]

            ; Option 2 is used
                ElseIf $iOption = 2 Then
                    ReDim $aReturn[UBound($aReturn) + 1][2]
                    $aReturn[0][0] += 1
                    $aReturn[$aReturn[0][0]][0] = $aWin[$i][0]
                    $aReturn[$aReturn[0][0]][1] = $aWin[$i][1]
                EndIf
            EndIf
        Next

    ; If option 2 is used and there was matches then the list is returned
        If $iOption = 2 And $aReturn[0][0] > 0 Then Return $aReturn

    ; If timed out then give up
        If TimerDiff($hTimer) > $iTimeout Then ExitLoop

    ; Waits before new attempt
        Sleep(Opt("WinWaitDelay"))
    WEnd


; No matches
    SetError(1)
    Return 0
EndFunc  ;==>_ProcessGetHWnd

$StaticTxt = ControlGetText("Embed Cmd","",1007)
 MsgBox(1,"Static Text", $StaticTxt)

GUISetState()
While GUIGetMsg() <> -3
WEnd

 

Share this post


Link to post
Share on other sites
Phoenixx177

Still not able to put this together.  Anyone have any insight?

Share this post


Link to post
Share on other sites
coffeeturtle

Are you experiencing a strange occurrence and that the window instead of being embedded is acting like an overlay? In other words, are you getting a window covering up another and can actually click and drag it out separating the two?

If so, I wonder about the DLL calls  you're making to make the parent/child windows. I could be wrong. But wouldn't something like this be more helpful:

 

$h_HWND = _IEPropertyGet($o_IE, "hwnd")
$hhwnd = WinGetProcess($hWnd)
_WinAPI_SetParent($h_HWND, [your GUI])
_WinAPI_MoveWindow($h_HWND, $0, $0, 1049, 550, False)
_WinAPI_SetWindowLong($h_HWND, $GWL_STYLE, $WS_POPUP + $WS_VISIBLE)

The two browser windows would be something like this:

$o_IE = ObjCreate("InternetExplorer.Application")
$o_IE.theatermode = True
$o_IE.fullscreen = True
$o_IE.statusbar = False
_IENavigate($o_IE, 'about:blank')
        
        and

$o_IETwo = ObjCreate("InternetExplorer.Application")
$o_IETwo.theatermode = True
$o_IETwo.fullscreen = True
$o_IETwo.statusbar = False
_IENavigate($o_IETwo, 'about:blank')

I hope this helps. The other folks here can add more insights.

  • Like 1

Share this post


Link to post
Share on other sites
kylomas

Phoenixx77,

You are overlaying your controls/windows and after the 2nd guicreate you do NOT do a GuiSetState() to show the gui...

kylomas

edit: This is not launching the command processor...

; launch the command prompt (black on white, without the operating system message)
$pid = run("C:\Program Files (x86)\Cisco\Router Manager\Router Administration.exe")

Also, not sure if winsetstate is the same as guisetstate...

edit2: Output from the cmd window is not read with windows cmds/funcs, rather with stdoutread.  So I am not sure what you expect from creating a cmd window.

If you outline what you are trying to do there are probably examples available.

Edited by kylomas
additional info

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites
Phoenixx177

@kylomas put simply I'm just trying to embed 2 browser windows and the router application.  We are doing web testing and want to watch the front end in one browser window, the back end in the other browser window, and the router in the 3rd.  This will be distributed to a few of our offices so it needs to be a standard GUI that encompasses both browsers and the router GUI in one AutoIT GUI.

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

  • Similar Content

    • Emmhor1
      By Emmhor1
      Hi All,

      MAIN QUESTION:
      Is it possible to Call specific function within a GUI

      So I have a script with multiple functions although I don't want to use every function every time.
      My Idea is to create a simple GUI which allows me to select what functions I want to use then run the funtions by clicking a button.
      I have already made a GUI which allows me to select specific .exe's I would like to run after selection it runs the .exe one by one.
      This script is on my work laptops and cannot access it right now.
       
      Who can help me with this?
      GUIcreate
      Func1 
      Func2
      Func3
      Then have a boxes which allows me to select the specif Func.(I used GUIChecked and Unchecked in my other script)
      Then a button which executes/calls the selected functions
    • Blois
      By Blois
      Hi Guis,
       
      I need to create keyboard shortcut to navigate the tabs and activate them, but I could not use the code below:
      #include <TabConstants.au3> #include <WindowsConstants.au3> #include <GuiTab.au3> #include <GUIConstantsEx.au3> HotKeySet("^{TAB}", "_TabRight") HotKeySet("^+{TAB}", "_TabLeft") $gui = GUICreate("test",450, 300) $Tab1 = GUICtrlCreateTab(20, 24, 425, 201) $TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1") $lbContagemGrupos2 = GUICtrlCreateLabel("aaaa", 50, 50) GUICtrlSetColor(-1, 0x0000FF) GUICtrlCreateTabItem("") $TabSheet2 = GUICtrlCreateTabItem(" ") $TabSheet3 = GUICtrlCreateTabItem(" ") GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func _TabRight() $CurPos = _GUICtrlTab_GetCurSel($Tab1) _GUICtrlTab_SetCurSel($Tab1, $CurPos + 1) $tab = "$TabSheet" & $CurPos GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW) Return EndFunc Func _TabLeft() $CurPos = _GUICtrlTab_GetCurSel($Tab1) _GUICtrlTab_SetCurSel($Tab1, $CurPos - 1) $tab = "$TabSheet" & $CurPos GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW) Return EndFunc Exit  
      can you help me?
    • Pricehacker
      By Pricehacker
      Hello again!
      I have tried searching for quite some time now but couldn´t find a single working way to change the class of your GUI that doesn´t include changing it manually after its compilation.
      First or "AutoIt v3 GUI" is a pretty boring name tbh and i would like to spice it up a bit, also, and more importantly, I would like to identify my windows by something other than its title as it will change depending on some factors and im using two different programs independently as multi threading isn't supported.
      Any help is appreciated! Thank you!
    • xtcislove
      By xtcislove
      Hello, 
      i have a Problem with  _WinAPI_SetLayeredWindowAttributes, everything is working as excepted if u are on Windows 7.

      But if u are on Windows 10 the transparent background of a control is not clickable anymore. 

      Could someone help?

      Please see example below, put cmd.jpg into the same folder as Example.au3

      Please see trigger.jpg to see which sections are not clickable in Windows 10 (the red dots, the green dots are clickable) on Windows 7 the red ones and green ones are clickable.
       
      The same problem occurs if i use 
       
       
      Example.au3


    • tommytx
      By tommytx
      ConsoleWrite("Hello Dolly on Line 1" & @CRLF) #include <IE.au3> ConsoleWrite("Hello Dolly on Line 5" & @CRLF) Local $oIE = _IECreate("www.autoitscript.com") ConsoleWrite("Hello Dolly on Line 10" & @CRLF) Can anyone put me on the right track to troubleshoot this one.. the IE browser is not opening.. it is not my primary browser since FF is but that has not been a problem in the past.. it all seems to work including compile but the generation of the IE browser.. Never had any problem before.. below is the results of the run.. any ideas on where I might look.. that is the only error i get and its only after a 30 second delay.. I suppose a time out..
       
      ; >"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "G:\show_pos.au3\test.au3"
      ; Hello Dolly on Line 1
      ; Hello Dolly on Line 5
      ; --> IE.au3 T3.0-2 Error from function _IECreate,  (Browser Object Creation Failed)
      ; Hello Dolly on Line 10
      ; >Exit code: 0    Time: 30.46
       
×