nomisre

Tab switch script for IE also switches tabs in Windows and other applications

26 posts in this topic

You are calling WinMove with the wrong parameters. The first two parameters should be title and text.

Share this post


Link to post
Share on other sites



#22 ·  Posted (edited)

You are calling WinMove with the wrong parameters. The first two parameters should be title and text.

Then again, I'm still not sure where to put this code in my script.

WinMove("title","text",1468,211,1280,1024)

1468 and 211 should be the positions for the second screen

Edited by nomisre

Share this post


Link to post
Share on other sites

Not always Title and Text is needed

https://www.autoitscript.com/autoit3/docs/functions/WinMove.htm

titleThe title/hWnd/class of the window to move/resize. See Title special definition.

 

#include <IE.au3>

_Example()
Func _Example()
    ; Opens two IE sessions with three example tabs
    Local $oIE1 = _IECreate("www.google.nl")
    Local $IEhwnd1 = _IEPropertyGet($oIE1, "hwnd")
    __IENavigate($oIE1, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE1, "http://www.telegraaf.nl", 0, 0x800)

    Local $oIE2 = _IECreate("www.google.nl")
    Local $IEhwnd2 = _IEPropertyGet($oIE2, "hwnd")
    __IENavigate($oIE2, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE2, "http://www.telegraaf.nl", 0, 0x800)

    ; Set full screen
    Send("{F11}")

    ; Tab loop
    While 1
    If WinExists($IEhwnd) Then
        WinActivate($IEhwnd)
    Else
        ExitLoop
    EndIf

    WinMove($IEhwnd2,"",1468,211,1280,1024)

    Sleep(5000)
    Send("^{TAB}")
    WEnd

    _IEQuit($oIE1)
    _IEQuit($oIE2)
    
EndFunc

 


Signature beginning:   Wondering who uses AutoIT and what it can be used for ?
* GHAPI UDF - modest begining - comunication with GitHub REST API *
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2017-06-04

Share this post


Link to post
Share on other sites

#24 ·  Posted (edited)

Not always Title and Text is needed

https://www.autoitscript.com/autoit3/docs/functions/WinMove.htm

titleThe title/hWnd/class of the window to move/resize. See Title special definition.

 

#include <IE.au3>

_Example()
Func _Example()
    ; Opens two IE sessions with three example tabs
    Local $oIE1 = _IECreate("www.google.nl")
    Local $IEhwnd1 = _IEPropertyGet($oIE1, "hwnd")
    __IENavigate($oIE1, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE1, "http://www.telegraaf.nl", 0, 0x800)

    Local $oIE2 = _IECreate("www.google.nl")
    Local $IEhwnd2 = _IEPropertyGet($oIE2, "hwnd")
    __IENavigate($oIE2, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE2, "http://www.telegraaf.nl", 0, 0x800)

    ; Set full screen
    Send("{F11}")

    ; Tab loop
    While 1
    If WinExists($IEhwnd) Then
        WinActivate($IEhwnd)
    Else
        ExitLoop
    EndIf

    WinMove($IEhwnd2,"",1468,211,1280,1024)

    Sleep(5000)
    Send("^{TAB}")
    WEnd

    _IEQuit($oIE1)
    _IEQuit($oIE2)
    
EndFunc

 

Hmm, still doesn't work... Even after trying all kinds of different positions.

EDIT:

After trying
WinMove($IEhwnd1,"",-8,-8,1280,1024) and WinMove($IEhwnd2,"",1272,-8,1280,1024), I managed to get one session on both screens :) The only problem now is, is that they are not full screen (F11) and one of them isn't switching to the next tab.

Edited by nomisre

Share this post


Link to post
Share on other sites

The code in first link in post 3 by mLipok is not too hard to implement based on the MSAA API. MSAccessibility.au3 below is an updated version of the API. Constants already included in AutoIt 3.3.14 are commented out, and IAccessible interface in CUIAutomation2.au3 by junkew is included.

test.au3

#include <IE.au3>
#include <GUIConstants.au3>
#include <WinAPIConstants.au3>
#include <WinAPI.au3>
#include "MSAccessibility.au3"

Global $aAccObjects[100][3], $iAccObjects = 0

Example()

Func Example()
  ; Opens IE with three tabs
  Local $oIE1 = _IECreate("www.google.nl")
  _IELoadWait($oIE1)
  Local $hwndIE1 = _IEPropertyGet($oIE1, "hwnd")

  __IENavigate($oIE1, "http://www.nu.nl", 0, 0x800)
  _IELoadWait($oIE1)
  Local $oIE2 = Null
  Do
      Sleep(10)
      $oIE2 = _IEAttach('http://www.nu.nl', 'url', 1)
  Until Not @error
  Local $hwndIE2 = _IEPropertyGet($oIE2, "hwnd")

  __IENavigate($oIE1, "http://www.telegraaf.nl", 0, 0x800)
  _IELoadWait($oIE1)
  Local $oIE3 = Null
  Do
      Sleep(10)
      $oIE3 = _IEAttach('http://www.telegraaf.nl', 'url', 1)
  Until Not @error
  Local $hwndIE3 = _IEPropertyGet($oIE3, "hwnd")

  MsgBox(0, @ScriptLineNumber, 'test')

  Local $hChild = 0, $hWindow = WinGetHandle( "[CLASS:IEFrame]", "" ) ; Internet Explorer
  FindChildWindowByClass( $hWindow, $hChild, "DirectUIHWND" ) ; This function does not depend on a specific IE version
  ;ConsoleWrite( "$hChild = " & $hChild & @CRLF & @CRLF )

  ; Accessible object
  Local $pChild, $oChild
  AccessibleObjectFromWindow( $hChild, $OBJID_CLIENT, $tIID_IAccessible, $pChild )
  WalkTreeWithAccessibleChildren( $pChild, 0, 2 ) ; The tabs belongs to level 1 (zero based)
  ;ConsoleWrite( @CRLF )                          ; Identifying the tabs by the level makes it independent of the localized string "Tab Row"

  For $i = 0 To $iAccObjects - 1
    If $aAccObjects[$i][2] = 1 Then ExitLoop      ; The tabs belongs to level 1
  Next
  Local $iAccFirst = $i, $iAccCount = $iAccObjects - $i - 1 ; Index of first tab, number of tabs

  Local $hGui = GUICreate( "IE Tabs", 400, 160, -1, 300, -1, $WS_EX_TOPMOST )

  Local $idBut1 = GUICtrlCreateButton( $aAccObjects[$iAccFirst][1], 10, 10, 380, 40 )
  For $i = 1 To $iAccCount - 1
    GUICtrlCreateButton( $aAccObjects[$iAccFirst+$i][1], 10, 10+$i*50, 380, 40 )
  Next

  GUISetState()

  Local $iMsg
  While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
      Case $idBut1 To $idBut1 + $iAccCount - 1
        $aAccObjects[$iAccFirst+$iMsg-$idBut1][0].accDoDefaultAction(0)
      Case $GUI_EVENT_CLOSE
        ExitLoop
    EndSwitch
  WEnd

  ; Cleanup
  For $i = 0 To $iAccObjects - 1
    $aAccObjects[$i][0] = 0
  Next
  GUIDelete( $hGui )
  Exit
EndFunc

Func FindChildWindowByClass( $hParent, ByRef $hFound, $sClass )
  If Not $hParent Then Return
  Local $hChild = _WinAPI_GetWindow( $hParent, $GW_CHILD )
  While $hChild
    If _WinAPI_GetClassName( $hChild ) = $sClass Then
      $hFound = $hChild
      Return
    EndIf
    FindChildWindowByClass( $hChild, $hFound, $sClass )
    $hChild = _WinAPI_GetWindow( $hChild, $GW_HWNDNEXT )
  WEnd
EndFunc

Func WalkTreeWithAccessibleChildren( $pAcc, $iLevel, $iLevels = 0 )
  If $iLevels And $iLevel = $iLevels Then Return

  ; Create object
  Local $oAcc = ObjCreateInterface( $pAcc, $sIID_IAccessible, $dtagIAccessible )
  If Not IsObj( $oAcc ) Then Return
  $oAcc.AddRef()

  Local $iChildCount, $iReturnCount, $tVarChildren

  ; Get children
  If $oAcc.get_accChildCount( $iChildCount ) Or Not $iChildCount Then Return
  If AccessibleChildren( $pAcc, 0, $iChildCount, $tVarChildren, $iReturnCount ) Then Return

  ; Indentation
  Local $sIndent = ""
  For $i = 0 To $iLevel - 1
    $sIndent &= "    "
  Next

  Local $vt, $oChildObj, $iChildElem, $sName

  ; For each child
  For $i = 1 To $iReturnCount

    ; $tVarChildren is an array of VARIANTs with information about the children
    $vt = BitAND( DllStructGetData( $tVarChildren, $i, 1 ), 0xFFFF )

    If $vt = $VT_DISPATCH Then

      ; Child object
      $pChildObj = DllStructGetData( $tVarChildren, $i, 3 )
      $aAccObjects[$iAccObjects][0] = ObjCreateInterface( $pChildObj, $sIID_IAccessible, $dtagIAccessible )
      If IsObj( $aAccObjects[$iAccObjects][0] ) Then
        ;PrintObjectInfo( $aAccObjects[$iAccObjects], $CHILDID_SELF, $sIndent )
        $aAccObjects[$iAccObjects][0].get_accName( $CHILDID_SELF, $sName )
        $aAccObjects[$iAccObjects][1] = $sName
        $aAccObjects[$iAccObjects][2] = $iLevel
        $iAccObjects += 1

        WalkTreeWithAccessibleChildren( $pChildObj, $iLevel + 1, $iLevels )
      EndIf

    Else ; $vt = $VT_I4

      ; Child element
      $iChildElem = DllStructGetData( $tVarChildren, $i, 3 )
      ;PrintObjectInfo( $oAcc, $iChildElem, $sIndent )

    EndIf

  Next
EndFunc

Func PrintObjectInfo( $oAcc, $iChild, $sIndent )
  Local $sName, $iRole, $sRole, $iRoleLen
  Local $iState, $sState, $iStateLen, $x, $y, $w, $h
  If $iChild <> $CHILDID_SELF Then _
    ConsoleWrite( $sIndent & "$iChildElem = " & $iChild & @CRLF )
  $oAcc.get_accName( $iChild, $sName )
  ConsoleWrite( $sIndent & "Name = " & $sName & @CRLF )
EndFunc

MSAccessibility.au3

#include-once

;#include "CUIAutomation2.au3"

;Global Const $S_OK                  = 0x00000000
Global Const $S_FALSE               = 0x00000001
;Global Const $E_NOTIMPL             = 0x80004001
;Global Const $E_NOINTERFACE         = 0x80004002
;Global Const $E_FAIL                = 0x80004005
Global Const $DISP_E_MEMBERNOTFOUND = 0x80020003
;Global Const $E_OUTOFMEMORY         = 0x8007000E
;Global Const $E_INVALIDARG          = 0x80070057

Global Const $VT_EMPTY    = 0
Global Const $VT_I4       = 3
Global Const $VT_DISPATCH = 9

;Global Const $tagVARIANT = "word vt;word r1;word r2;word r3;ptr data; ptr;"
If @AutoItX64 Then
  Global $tagVARIANT = "dword[6];" ; Use this form to be able to build an
Else                               ; array in function AccessibleChildren.
  Global $tagVARIANT = "dword[4];"
EndIf

;Global Const $tIID_IAccessible = CLSIDFromString( $sIID_IAccessible )

;Global Const $sIID_IServiceProvider = "{6D5140C1-7436-11CE-8034-00AA006009FA}"
;Global Const $tIID_IServiceProvider = CLSIDFromString( $sIID_IServiceProvider )
;Global Const $dtagIServiceProvider = "QueryService hresult(struct*;struct*;ptr*);"


; ========= MS Active Accessibility constants =========

; Child ID for the object itself
; (in contrast to simple child elements of the object)
Global Const $CHILDID_SELF = 0

; Navigation constants
Global Const $NAVDIR_MIN        = 0
Global Const $NAVDIR_UP         = 0x1
Global Const $NAVDIR_DOWN       = 0x2
Global Const $NAVDIR_LEFT       = 0x3
Global Const $NAVDIR_RIGHT      = 0x4
Global Const $NAVDIR_NEXT       = 0x5
Global Const $NAVDIR_PREVIOUS   = 0x6
Global Const $NAVDIR_FIRSTCHILD = 0x7
Global Const $NAVDIR_LASTCHILD  = 0x8
Global Const $NAVDIR_MAX        = 0x9

; Selection flags
Global Const $SELFLAG_NONE            = 0
Global Const $SELFLAG_TAKEFOCUS       = 0x1
Global Const $SELFLAG_TAKESELECTION   = 0x2
Global Const $SELFLAG_EXTENDSELECTION = 0x4
Global Const $SELFLAG_ADDSELECTION    = 0x8
Global Const $SELFLAG_REMOVESELECTION = 0x10
Global Const $SELFLAG_VALID           = 0x1f

; Object identifiers
;Global Const $OBJID_WINDOW            = 0x00000000
Global Const $OBJID_SYSMENU           = 0xFFFFFFFF
;Global Const $OBJID_TITLEBAR          = 0xFFFFFFFE
Global Const $OBJID_MENU              = 0xFFFFFFFD
Global Const $OBJID_CLIENT            = 0xFFFFFFFC
Global Const $OBJID_VSCROLL           = 0xFFFFFFFB
Global Const $OBJID_HSCROLL           = 0xFFFFFFFA
;Global Const $OBJID_SIZEGRIP          = 0xFFFFFFF9
;Global Const $OBJID_CARET             = 0xFFFFFFF8
;Global Const $OBJID_CURSOR            = 0xFFFFFFF7
;Global Const $OBJID_ALERT             = 0xFFFFFFF6
;Global Const $OBJID_SOUND             = 0xFFFFFFF5
Global Const $OBJID_QUERYCLASSNAMEIDX = 0xFFFFFFF4
Global Const $OBJID_NATIVEOM          = 0xFFFFFFF0

; Object roles
Global Const $ROLE_SYSTEM_TITLEBAR           = 0x1
Global Const $ROLE_SYSTEM_MENUBAR            = 0x2
Global Const $ROLE_SYSTEM_SCROLLBAR          = 0x3
Global Const $ROLE_SYSTEM_GRIP               = 0x4
Global Const $ROLE_SYSTEM_SOUND              = 0x5
Global Const $ROLE_SYSTEM_CURSOR             = 0x6
Global Const $ROLE_SYSTEM_CARET              = 0x7
Global Const $ROLE_SYSTEM_ALERT              = 0x8
Global Const $ROLE_SYSTEM_WINDOW             = 0x9
Global Const $ROLE_SYSTEM_CLIENT             = 0xa
Global Const $ROLE_SYSTEM_MENUPOPUP          = 0xb
Global Const $ROLE_SYSTEM_MENUITEM           = 0xc
Global Const $ROLE_SYSTEM_TOOLTIP            = 0xd
Global Const $ROLE_SYSTEM_APPLICATION        = 0xe
Global Const $ROLE_SYSTEM_DOCUMENT           = 0xf
Global Const $ROLE_SYSTEM_PANE               = 0x10
Global Const $ROLE_SYSTEM_CHART              = 0x11
Global Const $ROLE_SYSTEM_DIALOG             = 0x12
Global Const $ROLE_SYSTEM_BORDER             = 0x13
Global Const $ROLE_SYSTEM_GROUPING           = 0x14
Global Const $ROLE_SYSTEM_SEPARATOR          = 0x15
Global Const $ROLE_SYSTEM_TOOLBAR            = 0x16
Global Const $ROLE_SYSTEM_STATUSBAR          = 0x17
Global Const $ROLE_SYSTEM_TABLE              = 0x18
Global Const $ROLE_SYSTEM_COLUMNHEADER       = 0x19
Global Const $ROLE_SYSTEM_ROWHEADER          = 0x1a
Global Const $ROLE_SYSTEM_COLUMN             = 0x1b
Global Const $ROLE_SYSTEM_ROW                = 0x1c
Global Const $ROLE_SYSTEM_CELL               = 0x1d
Global Const $ROLE_SYSTEM_LINK               = 0x1e
Global Const $ROLE_SYSTEM_HELPBALLOON        = 0x1f
Global Const $ROLE_SYSTEM_CHARACTER          = 0x20
Global Const $ROLE_SYSTEM_LIST               = 0x21
Global Const $ROLE_SYSTEM_LISTITEM           = 0x22
Global Const $ROLE_SYSTEM_OUTLINE            = 0x23
Global Const $ROLE_SYSTEM_OUTLINEITEM        = 0x24
Global Const $ROLE_SYSTEM_PAGETAB            = 0x25
Global Const $ROLE_SYSTEM_PROPERTYPAGE       = 0x26
Global Const $ROLE_SYSTEM_INDICATOR          = 0x27
Global Const $ROLE_SYSTEM_GRAPHIC            = 0x28
Global Const $ROLE_SYSTEM_STATICTEXT         = 0x29
Global Const $ROLE_SYSTEM_TEXT               = 0x2a
Global Const $ROLE_SYSTEM_PUSHBUTTON         = 0x2b
Global Const $ROLE_SYSTEM_CHECKBUTTON        = 0x2c
Global Const $ROLE_SYSTEM_RADIOBUTTON        = 0x2d
Global Const $ROLE_SYSTEM_COMBOBOX           = 0x2e
Global Const $ROLE_SYSTEM_DROPLIST           = 0x2f
Global Const $ROLE_SYSTEM_PROGRESSBAR        = 0x30
Global Const $ROLE_SYSTEM_DIAL               = 0x31
Global Const $ROLE_SYSTEM_HOTKEYFIELD        = 0x32
Global Const $ROLE_SYSTEM_SLIDER             = 0x33
Global Const $ROLE_SYSTEM_SPINBUTTON         = 0x34
Global Const $ROLE_SYSTEM_DIAGRAM            = 0x35
Global Const $ROLE_SYSTEM_ANIMATION          = 0x36
Global Const $ROLE_SYSTEM_EQUATION           = 0x37
Global Const $ROLE_SYSTEM_BUTTONDROPDOWN     = 0x38
Global Const $ROLE_SYSTEM_BUTTONMENU         = 0x39
Global Const $ROLE_SYSTEM_BUTTONDROPDOWNGRID = 0x3a
Global Const $ROLE_SYSTEM_WHITESPACE         = 0x3b
Global Const $ROLE_SYSTEM_PAGETABLIST        = 0x3c
Global Const $ROLE_SYSTEM_CLOCK              = 0x3d
Global Const $ROLE_SYSTEM_SPLITBUTTON        = 0x3e
Global Const $ROLE_SYSTEM_IPADDRESS          = 0x3f
Global Const $ROLE_SYSTEM_OUTLINEBUTTON      = 0x40

; Object state constants
Global Const $STATE_SYSTEM_NORMAL          = 0
Global Const $STATE_SYSTEM_UNAVAILABLE     = 0x1
Global Const $STATE_SYSTEM_SELECTED        = 0x2
Global Const $STATE_SYSTEM_FOCUSED         = 0x4
;Global Const $STATE_SYSTEM_PRESSED         = 0x8
Global Const $STATE_SYSTEM_CHECKED         = 0x10
Global Const $STATE_SYSTEM_MIXED           = 0x20
Global Const $STATE_SYSTEM_INDETERMINATE   = $STATE_SYSTEM_MIXED
Global Const $STATE_SYSTEM_READONLY        = 0x40
Global Const $STATE_SYSTEM_HOTTRACKED      = 0x80
Global Const $STATE_SYSTEM_DEFAULT         = 0x100
Global Const $STATE_SYSTEM_EXPANDED        = 0x200
Global Const $STATE_SYSTEM_COLLAPSED       = 0x400
Global Const $STATE_SYSTEM_BUSY            = 0x800
Global Const $STATE_SYSTEM_FLOATING        = 0x1000
Global Const $STATE_SYSTEM_MARQUEED        = 0x2000
Global Const $STATE_SYSTEM_ANIMATED        = 0x4000
;Global Const $STATE_SYSTEM_INVISIBLE       = 0x8000
Global Const $STATE_SYSTEM_OFFSCREEN       = 0x10000
Global Const $STATE_SYSTEM_SIZEABLE        = 0x20000
Global Const $STATE_SYSTEM_MOVEABLE        = 0x40000
Global Const $STATE_SYSTEM_SELFVOICING     = 0x80000
Global Const $STATE_SYSTEM_FOCUSABLE       = 0x100000
Global Const $STATE_SYSTEM_SELECTABLE      = 0x200000
Global Const $STATE_SYSTEM_LINKED          = 0x400000
Global Const $STATE_SYSTEM_TRAVERSED       = 0x800000
Global Const $STATE_SYSTEM_MULTISELECTABLE = 0x1000000
Global Const $STATE_SYSTEM_EXTSELECTABLE   = 0x2000000
Global Const $STATE_SYSTEM_ALERT_LOW       = 0x4000000
Global Const $STATE_SYSTEM_ALERT_MEDIUM    = 0x8000000
Global Const $STATE_SYSTEM_ALERT_HIGH      = 0x10000000
Global Const $STATE_SYSTEM_PROTECTED       = 0x20000000
Global Const $STATE_SYSTEM_HASPOPUP        = 0x40000000
Global Const $STATE_SYSTEM_VALID           = 0x7fffffff

; Event constants
;#include "APIConstants.au3"   ; AutoIt 3.3.8.0+
#include <APISysConstants.au3> ; AutoIt 3.3.10.0+

#cs
Global Const $EVENT_MIN = 0x00000001
Global Const $EVENT_SYSTEM_SOUND = 0x00000001
Global Const $EVENT_SYSTEM_ALERT = 0x00000002
Global Const $EVENT_SYSTEM_FOREGROUND = 0x00000003
Global Const $EVENT_SYSTEM_MENUSTART = 0x00000004
Global Const $EVENT_SYSTEM_MENUEND = 0x00000005
Global Const $EVENT_SYSTEM_MENUPOPUPSTART = 0x00000006
Global Const $EVENT_SYSTEM_MENUPOPUPEND = 0x00000007
Global Const $EVENT_SYSTEM_CAPTURESTART = 0x00000008
Global Const $EVENT_SYSTEM_CAPTUREEND = 0x00000009
Global Const $EVENT_SYSTEM_MOVESIZESTART = 0x0000000A
Global Const $EVENT_SYSTEM_MOVESIZEEND = 0x0000000B
Global Const $EVENT_SYSTEM_CONTEXTHELPSTART = 0x0000000C
Global Const $EVENT_SYSTEM_CONTEXTHELPEND = 0x0000000D
Global Const $EVENT_SYSTEM_DRAGDROPSTART = 0x0000000E
Global Const $EVENT_SYSTEM_DRAGDROPEND = 0x0000000F
Global Const $EVENT_SYSTEM_DIALOGSTART = 0x00000010
Global Const $EVENT_SYSTEM_DIALOGEND = 0x00000011
Global Const $EVENT_SYSTEM_SCROLLINGSTART = 0x00000012
Global Const $EVENT_SYSTEM_SCROLLINGEND = 0x00000013
Global Const $EVENT_SYSTEM_SWITCHSTART = 0x00000014
Global Const $EVENT_SYSTEM_SWITCHEND = 0x00000015
Global Const $EVENT_SYSTEM_MINIMIZESTART = 0x00000016
Global Const $EVENT_SYSTEM_MINIMIZEEND = 0x00000017
Global Const $EVENT_SYSTEM_DESKTOPSWITCH = 0x00000020
Global Const $EVENT_OBJECT_CREATE = 0x00008000
Global Const $EVENT_OBJECT_DESTROY = 0x00008001
Global Const $EVENT_OBJECT_SHOW = 0x00008002
Global Const $EVENT_OBJECT_HIDE = 0x00008003
Global Const $EVENT_OBJECT_REORDER = 0x00008004
Global Const $EVENT_OBJECT_FOCUS = 0x00008005
Global Const $EVENT_OBJECT_SELECTION = 0x00008006
Global Const $EVENT_OBJECT_SELECTIONADD = 0x00008007
Global Const $EVENT_OBJECT_SELECTIONREMOVE = 0x00008008
Global Const $EVENT_OBJECT_SELECTIONWITHIN = 0x00008009
Global Const $EVENT_OBJECT_STATECHANGE = 0x0000800A
Global Const $EVENT_OBJECT_LOCATIONCHANGE = 0x0000800B
Global Const $EVENT_OBJECT_NAMECHANGE = 0x0000800C
Global Const $EVENT_OBJECT_DESCRIPTIONCHANGE = 0x0000800D
Global Const $EVENT_OBJECT_VALUECHANGE = 0x0000800E
Global Const $EVENT_OBJECT_PARENTCHANGE = 0x0000800F
Global Const $EVENT_OBJECT_HELPCHANGE = 0x00008010
Global Const $EVENT_OBJECT_DEFACTIONCHANGE = 0x00008011
Global Const $EVENT_OBJECT_ACCELERATORCHANGE = 0x00008012
Global Const $EVENT_OBJECT_INVOKED = 0x00008013
Global Const $EVENT_OBJECT_TEXTSELECTIONCHANGED = 0x00008014
Global Const $EVENT_OBJECT_CONTENTSCROLLED = 0x00008015
Global Const $EVENT_MAX = 0x7FFFFFFF

Global Const $WINEVENT_INCONTEXT = 0x04
Global Const $WINEVENT_OUTOFCONTEXT = 0x00
Global Const $WINEVENT_SKIPOWNPROCESS = 0x02
Global Const $WINEVENT_SKIPOWNTHREAD = 0x01
#ce


; ========= MS Active Accessibility interface =========

; Copied from CUIAutomation2.au3 by junkew

Global Const $sIID_IAccessible="{618736E0-3C3D-11CF-810C-00AA00389B71}"
Global $dtagIAccessible = "GetTypeInfoCount hresult(uint*);" & _ ; IDispatch
"GetTypeInfo hresult(uint;int;ptr*);" & _
"GetIDsOfNames hresult(struct*;wstr;uint;int;int);" & _
"Invoke hresult(int;struct*;int;word;ptr*;ptr*;ptr*;uint*);" & _
"get_accParent hresult(ptr*);" & _                               ; IAccessible
"get_accChildCount hresult(long*);" & _
"get_accChild hresult(variant;idispatch*);" & _
"get_accName hresult(variant;bstr*);" & _
"get_accValue hresult(variant;bstr*);" & _
"get_accDescription hresult(variant;bstr*);" & _
"get_accRole hresult(variant;variant*);" & _
"get_accState hresult(variant;variant*);" & _
"get_accHelp hresult(variant;bstr*);" & _
"get_accHelpTopic hresult(bstr*;variant;long*);" & _
"get_accKeyboardShortcut hresult(variant;bstr*);" & _
"get_accFocus hresult(struct*);" & _
"get_accSelection hresult(variant*);" & _
"get_accDefaultAction hresult(variant;bstr*);" & _
"accSelect hresult(long;variant);" & _
"accLocation hresult(long*;long*;long*;long*;variant);" & _
"accNavigate hresult(long;variant;variant*);" & _
"accHitTest hresult(long;long;variant*);" & _
"accDoDefaultAction hresult(variant);" & _
"put_accName hresult(variant;bstr);" & _
"put_accValue hresult(variant;bstr);"

Global Const $tIID_IAccessible = CLSIDFromString( $sIID_IAccessible )

; =====================================================


Global Const $hdllOleacc = DllOpen( "oleacc.dll" )

OnAutoItExitRegister( "ExitMSAccessibility" )

Func ExitMSAccessibility()
  DllClose( $hdllOleacc )
EndFunc


Func AccessibleChildren( $paccContainer, $iChildStart, $iChildren, ByRef $tVarChildren, ByRef $iObtained )
  Local $sVarArray = ""
  For $i = 1 To $iChildren
    $sVarArray &= $tagVARIANT
  Next
  $tVarChildren = DllStructCreate( $sVarArray )
  Local $aRet = DllCall( "oleacc.dll", "int", "AccessibleChildren", "ptr", $paccContainer, "int", $iChildStart, "int", $iChildren, "struct*", $tVarChildren, "int*", 0 )
  If @error Then Return SetError(1, 0, $S_FALSE)
  If $aRet[0] Then Return SetError(2, 0, $aRet[0])
  $iObtained = $aRet[5]
  Return $S_OK
EndFunc

Func AccessibleObjectFromEvent( $hWnd, $iObjectID, $iChildID, ByRef $pAccessible, ByRef $tVarChild )
  Local $tVARIANT = DllStructCreate( $tagVARIANT )
  Local $aRet = DllCall( $hdllOleacc, "int", "AccessibleObjectFromEvent", "hwnd", $hWnd, "dword", $iObjectID, "dword", $iChildID, "ptr*", 0, "struct*", $tVARIANT )
  If @error Then Return SetError(1, 0, $S_FALSE)
  If $aRet[0] Then Return SetError(2, 0, $aRet[0])
  $pAccessible = $aRet[4]
  $tVarChild = $aRet[5]
  Return $S_OK
EndFunc

Func AccessibleObjectFromPoint( $x, $y, ByRef $pAccessible, ByRef $tVarChild )
  Local $tPOINT = DllStructCreate( "long;long" )
  DllStructSetData( $tPOINT, 1, $x )
  DllStructSetData( $tPOINT, 2, $y )
  Local $tPOINT64 = DllStructCreate( "int64", DllStructGetPtr( $tPOINT ) )
  Local $tVARIANT = DllStructCreate( $tagVARIANT )
  Local $aRet = DllCall( $hdllOleacc, "int", "AccessibleObjectFromPoint", "int64", DllStructGetData( $tPOINT64, 1 ), "ptr*", 0, "struct*", $tVARIANT )
  If @error Then Return SetError(1, 0, $S_FALSE)
  If $aRet[0] Then Return SetError(2, 0, $aRet[0])
  $pAccessible = $aRet[2]
  $tVarChild = $aRet[3]
  Return $S_OK
EndFunc

Func AccessibleObjectFromWindow( $hWnd, $iObjectID, $tRIID, ByRef $pObject )
  Local $aRet = DllCall( $hdllOleacc, "int", "AccessibleObjectFromWindow", "hwnd", $hWnd, "dword", $iObjectID, "struct*", $tRIID, "int*", 0 )
  If @error Then Return SetError(1, 0, $S_FALSE)
  If $aRet[0] Then Return SetError(2, 0, $aRet[0])
  $pObject = $aRet[4]
  Return $S_OK
EndFunc

Func WindowFromAccessibleObject( $pAccessible, ByRef $hWnd )
  Local $aRet = DllCall( $hdllOleacc, "int", "WindowFromAccessibleObject", "ptr", $pAccessible, "hwnd*", 0 )
  If @error Then Return SetError(1, 0, $S_FALSE)
  If $aRet[0] Then Return SetError(2, 0, $aRet[0])
  $hWnd = $aRet[2]
  Return $S_OK
EndFunc

Func GetRoleText( $iRole, $sRole, $iRoleMax )
  Local $aRet = DllCall( $hdllOleacc, "uint", "GetRoleTextW", "dword", $iRole, "ptr", $sRole, "uint", $iRoleMax )
  If @error Then Return SetError(1, 0, 0)
  If Not $aRet[0] Then Return SetError(2, 0, 0)
  Return $aRet[0]
EndFunc

Func GetStateText( $iStateBit, $sStateBit, $iStateBitMax )
  Local $aRet = DllCall( $hdllOleacc, "uint", "GetStateTextW", "dword", $iStateBit, "ptr", $sStateBit, "uint", $iStateBitMax )
  If @error Then Return SetError(1, 0, 0)
  If Not $aRet[0] Then Return SetError(2, 0, 0)
  Return $aRet[0]
EndFunc

; Copied form WinAPISys.au3
; Authors: KaFu, Yashied, Jpm
Func SetWinEventHook($iEventMin, $iEventMax, $pEventProc, $iProcessID = 0, $iThreadID = 0, $iFlags = 0)
  Local $Ret = DllCall('user32.dll', 'handle', 'SetWinEventHook', 'uint', $iEventMin, 'uint', $iEventMax, 'ptr', 0, _
    'ptr', $pEventProc, 'dword', $iProcessID, 'dword', $iThreadID, 'uint', $iFlags)
  If @error Then Return SetError(@error, @extended, 0)
  Return $Ret[0]
EndFunc

; Copied form WinAPISys.au3
; Authors: KaFu, Yashied, Jpm
Func UnhookWinEvent($hEventHook)
  Local $Ret = DllCall('user32.dll', 'bool', 'UnhookWinEvent', 'handle', $hEventHook)
  If @error Then Return SetError(@error, @extended, False)
  Return $Ret[0]
EndFunc

; Copied form WinAPICom.au3
; Authors: Yashied, Jpm
Func CoTaskMemFree($pMemory)
  DllCall('ole32.dll', 'none', 'CoTaskMemFree', 'ptr', $pMemory)
  If @error Then Return SetError(@error, @extended, 0)
  Return 1
EndFunc

; Copied and slightly modified from AutoItObject.au3 by the AutoItObject-Team
Func CLSIDFromString( $sIID )
  Local $tCLSID = DllStructCreate( "dword;word;word;byte[8]" )
  Local $aRet = DllCall( "ole32.dll", "long", "CLSIDFromString", "wstr", $sIID, "struct*", $tCLSID )
  If @error Then Return SetError(1, @error, 0)
  If $aRet[0] <> 0 Then Return SetError(2, $aRet[0], 0)
  Return $tCLSID
EndFunc


Func PrintElementInfo( $oElement, $iChild, $sIndent )
  Local $sName, $iRole, $sRole, $iRoleLen
  Local $iState, $sState, $iStateLen
  Local $sValue, $x, $y, $w, $h
  If $iChild <> $CHILDID_SELF Then _
    ConsoleWrite( $sIndent & "$iChildElem = " & $iChild & @CRLF )
  $oElement.get_accName( $iChild, $sName )
  ConsoleWrite( $sIndent & "$sName  = " & $sName & @CRLF )
  If $oElement.get_accRole( $iChild, $iRole ) = $S_OK Then
    ConsoleWrite( $sIndent & "$iRole  = 0x" & Hex( $iRole ) & @CRLF )
    $iRoleLen = GetRoleText( $iRole, 0, 0 ) + 1
    $sRole = DllStructCreate( "wchar[" & $iRoleLen & "]" )
    GetRoleText( $iRole, DllStructGetPtr( $sRole ), $iRoleLen )
    ConsoleWrite( $sIndent & "$sRole  = " & DllStructGetData( $sRole, 1 ) & @CRLF )
  EndIf
  If $oElement.get_accState( $iChild, $iState ) = $S_OK Then
    ConsoleWrite( $sIndent & "$iState = 0x" & Hex( $iState ) & @CRLF )
    $iStateLen = GetStateText( $iState, 0, 0 ) + 1
    $sState = DllStructCreate( "wchar[" & $iStateLen & "]" )
    GetStateText( $iState, DllStructGetPtr( $sState ), $iStateLen )
    ConsoleWrite( $sIndent & "$sState = " & DllStructGetData( $sState, 1 ) & @CRLF )
  EndIf
  If $oElement.get_accValue( $iChild, $sValue ) = $S_OK Then _
    ConsoleWrite( $sIndent & "$sValue = " & $sValue & @CRLF )
  IF $oElement.accLocation( $x, $y, $w, $h, $iChild ) = $S_OK Then _
    ConsoleWrite( $sIndent & "$x, $y, $w, $h = " & $x & ", " & $y & ", " & $w & ", " & $h & @CRLF )
  ConsoleWrite( @CRLF )
EndFunc

All code is included in the zip: 

IETabs.7z

1 person likes this

Share this post


Link to post
Share on other sites

#26 ·  Posted (edited)

It's almost working now :D See my code below.
The only problems I have now are:

During switching tabs on the first screen: full screen -> not full screen (maximized) -> full screen -> not full screen (maximized), etc etc

On the second screen: maximized window (so not full screen) and switching to the next tab doesn't work

 

#include <IE.au3>

_Example()
Func _Example()
    ; Opens two IE sessions with three example tabs
    Local $oIE1 = _IECreate("www.google.nl")
    Local $IEhwnd1 = _IEPropertyGet($oIE1, "hwnd")
    __IENavigate($oIE1, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE1, "http://www.telegraaf.nl", 0, 0x800)

    Local $oIE2 = _IECreate("www.google.nl")
    Local $IEhwnd2 = _IEPropertyGet($oIE2, "hwnd")
    __IENavigate($oIE2, "http://www.nu.nl", 0, 0x800)
    __IENavigate($oIE2, "http://www.telegraaf.nl", 0, 0x800)



    ; Tab loop
    While 1
    If WinExists($IEhwnd1) Then
        WinActivate($IEhwnd2)
    Else
        ExitLoop
     EndIf


    WinMove($IEhwnd1,"",1272,-8,1280,1024)
    WinMove($IEhwnd2,"",-8,-8,1280,1024)


    Send("{F11}") ; Set full screen

    Sleep(5000)
    Send("^{TAB}")
    WEnd

    _IEQuit($oIE1)
    _IEQuit($oIE2)

EndFunc

 

Edited by nomisre

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