Outlook - immer wieder das gleiche Thema

  • Ich suche verzweifelt nach einer Lösung die speziellen Microsoft Toolbars mittels AutoIt
    - zu nutzen
    - zu manipulieren
    - zu ergänzen

    Auch im englischen Forum bin ich bisher auf keine Lösung gestoßen.
    Microsoft nutzt Symbolleisten in Word, Excel, Outlook etc.
    Nehmen wir mal Outlook als Beispiel:

    Da ich mehrere Konten im Outlook eingerichtet habe, aber je nach Verbindung nur das eine oder andere auf neue Mail abfragen kann, wollte ich mir Buttons in der Menüleiste (Symbolleiste) erstellen, die dann "auf Knopfdruck" die entsprechenden Mails lädt.

    Mein Problem besteht nun darin, die Controls richtig anzusteuern.
    Im Outlook möchte ich über den Knopf folgende Sequenz aufrufen : "Senden/Empfangen" - "3 .." - "Posteingang"
    (Siehe Anhang)

    Da ich mich mit COM Objekten nicht auskenne, bleiben meines Erachtens nach nur "send" (als 2'te Alternative) oder die Nutzung von Auto3Lib Funktionen (meine präferierter Lösungswunsch).

    So sehr ich mich auch bemühe - bei den Menüs regt sich nix....

    Ich würde mich freuen, wenn dieses Thema (an dessen Lösung sicher viele interessiert sind - wenn man die Anzahl der Posts betrachtet) hier zusammen gelöst und mit einem oder mehreren Beispielen belegt wird.

    Fangen wir mit dem Punkt 1 (vorhandene Menüs nutzen) an:

    Hier mein Script - wer kann helfen?

    Spoiler anzeigen


    #include <A3LMenu.au3>
    #include <A3LToolbar.au3>
    #include <A3LTreeView.au3>

    Opt("MustDeclareVars", 1)
    Global $hToolbar

    ; ===============================================================================================================================
    ; Main
    ; ===============================================================================================================================
    Run("c:\Program Files\Microsoft Office\OFFICE11\outlook.exe";)
    WinActivate("Inbox - Microsoft Outlook", "";)
    _Lib_WinWaitActive("[CLASS:rctrl_renwnd32]";)
    $hToolbar = _Toolbar_FindToolbar("[CLASS:rctrl_renwnd32]", "Senden/Empf&angen";)

    SE()
    ; ===============================================================================================================================

    Func SE()
    Local $hTree, $hRoot
    _Toolbar_ClickAccel($hToolbar, "a";)
    _Menu_ClickPopupAccel("3";)
    EndFunc

    Über diese Funktion bekomme ich den ClassName heraus

    Spoiler anzeigen


    Opt('WinTitleMatchMode', 4)

    $PID = Run("c:\Program Files\Microsoft Office\OFFICE11\outlook.exe";)
    WinWaitActive("Inbox - Microsoft Outlook";)

    Global $Control_To_Interact_With_Is = _CtrlGetByPos('classname=rctrl_renwnd32', '', 200, 35, 3)
    If IsArray($Control_To_Interact_With_Is) Then
    For $i = 1 To UBound($Control_To_Interact_With_Is) - 1
    ;MsgBox(0, '', $Control_To_Interact_With_Is[$i])
    ConsoleWrite($i-1 & "Info ........: " & $Control_To_Interact_With_Is[$i] & @CR)

    If $i=0 then $className = $Control_To_Interact_With_Is[$i]
    If $i=1 then $controlID = $Control_To_Interact_With_Is[$i]
    If $i=2 then $controlHandle = $Control_To_Interact_With_Is[$i]
    Next
    EndIf


    ;MsgBox(64,"Infos: ",$Control_To_Interact_With_Is[0] & @crlf & $Control_To_Interact_With_Is[1] & @crlf & $Control_To_Interact_With_Is[2] & @crlf)
    ;===============================================================================
    ; Function Name: _CtrlGetByPos()
    ; Description: Get the Control ID or the ClassNameNN by the X and Y client coordinates
    ; Syntax: _CtrlGetByPos("Window Title", [Control Text], [X Client Coord], [Y Client Coord], [Return Type])
    ;
    ; Parameter(s): $hWin = Window Name or Handle
    ; $sText = Text of the Control
    ; $iXPos = X Client Coord
    ; $iYPos = Y Client Coord
    ; $iReturnType = Return type (default = 0 (ClassNameNN))
    ; 0 = ClassNameNN
    ; 1 = Control ID
    ; 2 = Control Handle
    ; 3 = All 3 ClassNameNN, Control ID, Control Handle
    ;
    ;
    ; Requirement(s): External: = None.
    ; Internal: = AutoIt Beta 3.1.130 (or which ever release SetError(0,0,0) was introduced)
    ;
    ; Return Value(s): On Success: = Returns Array List
    ; On Failure: = @error 1 (Control was found but there was an error with the DLLCall)
    ; On Failure: = @error 2 (No classes were found)
    ;
    ; Author(s): SmOke_N
    ;
    ; Note(s): Similar to LxP's here (This was made before I remembered he had done something similar)
    ; http://www.autoitscript.com/forum/index.php?showtopic=14323&hl=
    ;
    ;
    ; Example(s):
    ; Opt('WinTitleMatchMode', 4)
    ; _CtrlGetByPos('classname=SciTEWindow', '', 829, 504, 2)
    ;===============================================================================

    Func _CtrlGetByPos($hWin, $sText = '', $iXPos = 0, $iYPos = 0, $iReturnType = 0)
    If IsString($hWin) Then $hWin = WinGetHandle($hWin)
    Local $sClassList = WinGetClassList($hWin), $hCtrlWnd
    Local $sSplitClass = StringSplit(StringTrimRight($sClassList, 1), @LF), $aReturn = ''
    For $iCount = UBound($sSplitClass) - 1 To 1 Step - 1
    Local $nCount = 0
    While 1
    $nCount += 1
    Local $aCPos = ControlGetPos($hWin, $sText, $sSplitClass[$iCount] & $nCount)
    If @error Then ExitLoop
    If $iXPos >= $aCPos[0] And $iXPos <= ($aCPos[0] + $aCPos[2]) _
    And $iYPos >= $aCPos[1] And $iYPos <= ($aCPos[1] + $aCPos[3]) Then
    If $sSplitClass[$iCount] <> '' And Not $iReturnType Then
    Local $aClassNN[2] = [2, $sSplitClass[$iCount] & $nCount]
    Return $aClassNN
    EndIf
    If $sSplitClass[$iCount] <> '' And $iReturnType = 3 Then
    $hCtrlWnd = ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
    ControlFocus($hWin, $sText, $hCtrlWnd)
    $aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
    If @error = 0 And $aReturn[0] <> '' Then
    Local $aClassNN[4] = [4, $aReturn[0], $sSplitClass[$iCount] & $nCount, $hCtrlWnd]
    Return $aClassNN
    EndIf
    Local $aClassNN[2] = [2, $sSplitClass[$iCount] & $nCount]
    Return $aClassNN
    ElseIf $sSplitClass[$iCount] <> '' And $iReturnType = 2 Then
    Return ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
    ElseIf $sSplitClass[$iCount] <> '' And $iReturnType = 1 Then
    $hCtrlWnd = ControlGetHandle($hWin, $sText, $sSplitClass[$iCount] & $nCount)
    ControlFocus($hWin, $sText, $hCtrlWnd)
    $aReturn = DllCall('User32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hCtrlWnd)
    If @error = 0 And $aReturn[0] <> '' Then
    Local $aClassNN[2] = [2, $aReturn[0]]
    Return $aClassNN
    EndIf
    EndIf
    Return SetError(1, 0, 0)
    EndIf
    WEnd
    Next
    Return SetError(2, 0, 0)
    EndFunc

    Demnach hat der Button "Senden/Empfangen" den ClassName : MsoCommandBarDock3

    Wie gehts nun weiter?

    Ich würde mich über rege Beteiligung freuen.
    Dizzy