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