Das Problem ist nicht das Auslesen, das ist easy.
Wenn du das Fenster 'neue Mail' öffnest, mußt du auswählen welchen Absender du haben willst (wenn mehrere Konten vorhanden sind).
Die Auswahl des Absenders habe ich bereits vorher getroffen, ich muß nur diese Adresse in das Absenderfeld eintragen. Da dies kein Eingabefeld ist und TB nicht seine Controls freigibt
habe ich keine Möglichkeit ohne User-Eingriff den Absender auszuwählen.
Beiträge von BugFix
-
-
Die Überschrift sagt es schon. Ich habe eine UDF erstellt. Sie funktioniert.
Nun brauche ich dieselbe Funktion nochmals - was liegt näher, als sie mit Variablen aufzurufen. Doch dann versagt sie.
Hier der Code, ich habe es kommentiert.Spoiler anzeigen
Code
Alles anzeigen; markierter Eintrag wird im Array gelöscht ; Liste wird gelöscht, dann Einträge aus Array neu in Liste gesetzt ; funktioniert Func _AttachDel() Dim $tmp = GUICtrlRead($lAttach), $tmp1, $sDrive, $sDir, $sFName, $sExt, $aPath, $i = 1 If $tmp <> "" Then While UBound($aFullPath) > 0 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) If $sFName & $sExt = $tmp Then _ArrayDelete($aFullPath, $i) ExitLoop EndIf $i = $i +1 WEnd GUICtrlSetData($lAttach, "") For $i = 1 To UBound($aFullPath) -1 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) GUICtrlSetData($lAttach, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf Next EndIf EndFunc ; Hier die gleiche Funktion mit Übergabe von Array und Liste ; wird aber nur ausgeführt bis: GUICtrlSetData($delList, "") ; es erfolgt kein Eintritt in die Schleife zur Befüllung der Liste (getestet mit einer Messagebox) ; Aufruf mit: _AttachDel($aFullPath, $lAttach) Func _AttachDel($delArray, $delList) Dim $tmp = GUICtrlRead($delList), $tmp1, $sDrive, $sDir, $sFName, $sExt, $aPath, $i = 1 If $tmp <> "" Then For $i =1 To UBound($delArray) - 1 $tmp1 = _PathSplit($delArray[$i], $sDrive, $sDir, $sFName, $sExt) If $sFName & $sExt = $tmp Then _ArrayDelete($delArray, $i) ExitLoop EndIf Next GUICtrlSetData($delList, "") For $i = 1 To UBound($delArray) -1 $tmp1 = _PathSplit($delArray[$i], $sDrive, $sDir, $sFName, $sExt) GUICtrlSetData($delList, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf Next EndIf EndFunc -
Hab jetzt alles einheitlich auf ..Hide/Show umgestellt und
ja, HURRA es geht.
Dann kann ich ja mal ans komplettieren gehen. Also bis dann.
-
Ja, hat leider nix gebracht. Egal ob ..Hide/Show oder ..Minimize/Restore - nach der Funktion seh ich meine GUI einfach nicht wieder nur das Tray-Icon bleibt

-
-
Nach dem Schließen des Adressbuchs, wird mit "Alt+d" und "b" Thunderbird geschlossen.
@SW_RESTORE hatte ich eigentlich schon probiert, aber ich teste es gleich nochmal. -
Nicht erschrecken, bei dem langen Code

Also, ich hab zumindest herausgefunden, dass die Probleme durch GUICtrlSetState() entstehen.
In der Funktion "_AdressAdd()" werden zum Ende Send("!d") und Send("b") ausgeführt. Wenn GUICtrlSetState() aktiv ist, werden diese Send()-Befehle auch von SciTe angenommen und der Debugmodus startet. Deaktivier ich das GUICtrlSetState() krieg ich meine GUI nicht wieder.
*grübel*Spoiler anzeigen
C
Alles anzeigen#include <GUIConstants.au3> #Include <Misc.au3> #include <Array.au3> #include <file.au3> #region Deklaration Global $absender, $adresse, $sendBetreff, $sendMail, $i, $aAdressen[1], $attachname = "", $x = 1, $y = 1, $aFullPath[1], $weiter, $aEZ[1][5] $path = "C:\Programme\Mozilla Thunderbird\thunderbird.exe" ; Anmerkung zu 1D-Arrays: $array[0] wird nicht belegt, somit erster Eintrag auch auf $array[1] ; wenn nur $array[0] existiert ist Ubound() = 1, somit Array leer wenn Ubound() nicht größer 1 #endregion Deklaration #region GUI ; GUI Einzelkonfiguration $GUI_Mail_EZ = GUICreate("Thunderbird Mail Scheduler - Einzelmail Konfiguration -", 609, 642, -1, -1) $grEmpfEZ = GUICtrlCreateGroup("Empfänger", 16, 8, 577, 49) $cEmpfEZ = GUICtrlCreateCombo("", 24, 24, 329, 21, -1, $WS_EX_CLIENTEDGE) $bVorigerEZ = GUICtrlCreateButton("Voriger", 384, 24, 89, 22) GUICtrlCreateGroup("", -99, -99, 1, 1) $bNextEZ = GUICtrlCreateButton("Nächster", 496, 24, 89, 22) $grAnhangEZ = GUICtrlCreateGroup("Anhangliste", 16, 64, 577, 49) $cAttachlistEZ = GUICtrlCreateCombo("", 24, 80, 329, 21) GUICtrlCreateGroup("", -99, -99, 1, 1) $bAttachAddEZ = GUICtrlCreateButton("Himzufügen", 384, 80, 89, 22) $bAttachDelEZ = GUICtrlCreateButton("Entfernen", 496, 80, 89, 22) $grTextVarEZ = GUICtrlCreateGroup("Textvariablen", 16, 120, 345, 49) $cTextVarEZ = GUICtrlCreateCombo("", 24, 138, 329, 21) GUICtrlSetData(-1, "{Mail Nr: x}", "{Mail Nr: x}") ; Platzhalter, werden bei Versand befüllt GUICtrlSetData(-1, "{Mail Nr: x von y}") ; Platzhalter GUICtrlSetData(-1, "{Dateiname(n) Anhang}") ; Platzhalter GUICtrlCreateGroup("", -99, -99, 1, 1) $grVarZielEZ = GUICtrlCreateGroup("Variable einfügen in:", 376, 120, 217, 49) $bVarBetreffEZ = GUICtrlCreateButton("Betreff", 384, 138, 89, 22) $bVarMailEZ = GUICtrlCreateButton("Mail", 496, 138, 89, 22) GUICtrlCreateGroup("", -99, -99, 1, 1) $grBetreffEZ = GUICtrlCreateGroup("Betreff", 16, 192, 577, 49) $iBetreffEZ = GUICtrlCreateInput("", 24, 210, 561, 21, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $grMailEZ = GUICtrlCreateGroup("Mail", 16, 248, 577, 209) $eMailEZ = GUICtrlCreateEdit("", 24, 264, 561, 185, -1, $WS_EX_CLIENTEDGE) GUICtrlSetData($eMailEZ, "eMail") GUICtrlCreateGroup("", -99, -99, 1, 1) $shapeEZ = GUICtrlCreateGraphic(16, 178, 577, 3, $SS_SUNKEN) $grAttachEZ = GUICtrlCreateGroup("Mail - Anhang", 16, 464, 449, 161) $lAttachEZ = GUICtrlCreateList("", 24, 486, 433, 149, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $bEscapeEZ = GUICtrlCreateButton("Abbrechen", 488, 472, 105, 25) $bSendEZ = GUICtrlCreateButton("Senden", 488, 600, 105, 25) $cbDownPCEZ = GUICtrlCreateCheckbox("PC herunterfahren nach Versand", 488, 536, 105, 49, $BS_MULTILINE) ; GUI Start $GUI_MailSchedul = GUICreate("Thunderbird Mail Scheduler", 609, 642, -1, -1) $grAbsender = GUICtrlCreateGroup("Absender", 16, 8, 577, 49) $iAbsender = GUICtrlCreateInput("", 24, 24, 329, 21, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $bAbsChg = GUICtrlCreateButton("Ändern", 496, 24, 89, 22) $grEmpf = GUICtrlCreateGroup("Empfängerliste", 16, 64, 577, 49) $cAdresslist = GUICtrlCreateCombo("", 24, 80, 329, 21) GUICtrlCreateGroup("", -99, -99, 1, 1) $bAdressAdd = GUICtrlCreateButton("Himzufügen", 384, 80, 89, 22) $bAdressDel = GUICtrlCreateButton("Entfernen", 496, 80, 89, 22) $grTextVar = GUICtrlCreateGroup("Textvariablen", 16, 120, 345, 49) $cTextVar = GUICtrlCreateCombo("", 24, 138, 329, 21) GUICtrlSetData(-1, "{Mail Nr: x}", "{Mail Nr: x}") ; Platzhalter, werden bei Versand befüllt GUICtrlSetData(-1, "{Mail Nr: x von y}") ; Platzhalter GUICtrlSetData(-1, "{Dateiname(n) Anhang}") ; Platzhalter GUICtrlCreateGroup("", -99, -99, 1, 1) $grVarZiel = GUICtrlCreateGroup("Variable einfügen in:", 376, 120, 217, 49) $bVarBetreff = GUICtrlCreateButton("Betreff", 384, 138, 89, 22) $bVarMail = GUICtrlCreateButton("Mail", 496, 138, 89, 22) GUICtrlCreateGroup("", -99, -99, 1, 1) $grBetreff = GUICtrlCreateGroup("Betreff", 16, 192, 577, 49) $iBetreff = GUICtrlCreateInput("", 24, 210, 561, 21, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $grMail = GUICtrlCreateGroup("Mail", 16, 248, 577, 209) $eMail = GUICtrlCreateEdit("", 24, 264, 561, 185, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $shape = GUICtrlCreateGraphic(16, 178, 577, 3, $SS_SUNKEN) $grAttach = GUICtrlCreateGroup("Mail - Anhang", 16, 464, 449, 161) $lAttach = GUICtrlCreateList("", 24, 486, 297, 149, -1, $WS_EX_CLIENTEDGE) $rAttachSame = GUICtrlCreateRadio("Für alle gleich", 352, 486, 105, 17) GUICtrlSetState(-1, $GUI_CHECKED) $rAttachDiff = GUICtrlCreateRadio("Für jeden anders", 352, 509, 105, 17) $bAttachAdd = GUICtrlCreateButton("Hinzufügen", 352, 560, 89, 22) $bAttachDel = GUICtrlCreateButton("Entfernen", 352, 587, 89, 22) $rAll4One = GUICtrlCreateRadio("an eine Adresse nacheinander", 352, 525, 97, 33, $BS_MULTILINE) GUICtrlCreateGroup("", -99, -99, 1, 1) $bClean = GUICtrlCreateButton("Auswahl löschen", 488, 472, 105, 25) $bEscape = GUICtrlCreateButton("Abbrechen", 488, 507, 105, 25) $cbDownPC = GUICtrlCreateCheckbox("PC Herunterfahren nach Versand", 488, 542, 105, 50, $BS_MULTILINE) $bSend = GUICtrlCreateButton("Senden", 488, 600, 105, 25) GUISetState(@SW_SHOW) #endregion GUI #region Code Opt("WinTitleMatchMode",2) While 1 $msg = GuiGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $bEscape ExitLoop Case $msg = $bAbsChg _AbsChg() Case $msg = $bAdressAdd _AdressAdd() Case $msg = $bAdressDel _AdressDel() Case $msg = $bVarBetreff _InVarBetreff() Case $msg = $bVarMail _InVarMail() Case $msg = $bAttachAdd _AttachAdd() Case $msg = $bAttachDel _AttachDel() Case $msg = $bClean _GUIclean() Case $msg = $bSend $modeSame = GUICtrlRead($rAttachSame) $modeDiff = GUICtrlRead($rAttachDiff) $modeOne = GUICtrlRead($rAll4One) If $modeSame = 1 Then _Same4All() ; Text und Anhang für alle gleich If $modeDiff = 1 Then ; Text und Anhang für jede Adresse individuell $weiter = MsgBox(4, "Hinweis", "Alle Dateianhänge, die Sie versenden wollen," & @LF & "müssen bereits ausgewählt sein." & @LF & @LF & "Im folgenden Fenster ordnen Sie jedem Empfänger" & @LF & "individuell Betreff, Mailtext und Anhang zu." & @LF & @LF & "Wollen Sie fortsetzen?") If $weiter = 6 Then GUICtrlRead($sendBetreff) GUICtrlRead($sendMail) _FillEZ() GUISetState(@SW_HIDE, $GUI_MailSchedul) GUISetState(@SW_SHOW, $GUI_Mail_EZ) ;_Diff4All() EndIf EndIf If $modeOne = 1 Then _All4One() ; einzelner Empfänger erhält jeweils Mail + 1 Anhang bis Anhangliste leer (für gesplittete Anhänge) If GUICtrlRead($cbDownPC) = 1 Then Sleep(10);Shutdown(9) Case $msg = $bVorigerEZ Case $msg = $bNextEZ Case $msg = $bAttachAddEZ Case $msg = $bAttachDelEZ Case $msg = $bVarBetreffEZ Case $msg = $bVarMailEZ Case $msg = $bEscapeEZ GUISetState(@SW_HIDE, $GUI_Mail_EZ) GUISetState(@SW_RESTORE, $GUI_MailSchedul) Case $msg = $bSendEZ EndSelect WEnd Exit #endregion Code #region Funktionen Func _AbsChg() ; GUISetState(@SW_MINIMIZE, $GUI_MailSchedul) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(500) Send("!b") Sleep(50) Send("g") MsgBox(0,"Absenderkonto","Bitte klicken Sie in der linken Spalte" & @LF & @LF & "auf das Absenderkonto." & @LF & @LF & @LF & "Bestätigen Sie die Auswahl mit <F9> !") While _IsPressed("78") = 0 ; Warten bis User-Auswahl beendet und <F9> gedrückt Sleep(150) WEnd Send("!e") Sleep(50) Send("+{HOME}") Send("^c") $absender = ClipGet() GUICtrlSetData($iAbsender, $absender) Send ("+{TAB}") Send("{ESC}") Sleep(50) Send("!{F4}") ; GUISetState(@SW_RESTORE, $GUI_MailSchedul) EndFunc Func _AdressAdd() Dim $state = 1, $weiter, $tmp ; GUISetState(@SW_HIDE, $GUI_MailSchedul) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(50) Send("^2") ; öffnet Adressbuch WinWaitActive("Adressbuch") MsgBox(0,"Zieladresse","Bitte Doppelklick auf gewünschte Adresse im Adressbuch!") Do ClipPut("") WinWaitActive("Karte") Sleep(250) Send("{TAB 4}") ; markiert Adresse Sleep(100) Send("^c") ; kopieren $adresse = ClipGet() Send("{ESC}") If $adresse <> "" Then $tmp = _ArraySearch($aAdressen, $adresse, 1) If $tmp = -1 Then GUICtrlSetData($cAdresslist, $adresse, $adresse) _ArrayAdd($aAdressen, $adresse) _ArraySort($aAdressen) Else MsgBox(0, "Hinweis", "Diese Adresse wurde bereits ausgewählt") EndIf Else MsgBox(0,"Hinweis", "Auswahl Adresseintrag ist fehlgeschlagen!") EndIf $weiter = MsgBox(4,"gewählte Adresse: " & $adresse, "..weitere Adresse auswählen?") If $weiter = 7 Then Send("^q") ; nein (ja = 6) $state = WinGetState("Adressbuch") Until $state = 0 Send("!d") Send("b") ; GUISetState(@SW_RESTORE, $GUI_MailSchedul) EndFunc Func _AdressDel() Dim $tmp = GUICtrlRead($cAdresslist), $i = 1 While UBound($aAdressen) > 0 If $aAdressen[$i] = $tmp Then _ArrayDelete($aAdressen, $i) ExitLoop EndIf $i = $i +1 WEnd GUICtrlSetData($cAdresslist, "") For $i = 1 To UBound($aAdressen) -1 GUICtrlSetData($cAdresslist, $aAdressen[$i], $aAdressen[$i]) Next EndFunc Func _InVarBetreff() Dim $tmp = GUICtrlRead($cTextVar), $tmp1 = GUICtrlRead($iBetreff) $tmp = $tmp1 & " " & $tmp $tmp = StringStripWS($tmp, 1) GUICtrlSetData($iBetreff, $tmp) EndFunc Func _InVarMail() Dim $tmp = GUICtrlRead($cTextVar), $tmp1 = GUICtrlRead($eMail) $tmp = $tmp1 & " " & $tmp $tmp = StringStripWS($tmp, 1) GUICtrlSetData($eMail, $tmp) EndFunc Func _AttachAdd() Dim $tmp, $sDrive, $sDir, $sFName, $sExt, $aPath $tmp = FileOpenDialog("",@HomePath, "Alle (*.*)") $iKeyIndex = _ArrayBinarySearch ( $aFullPath, $tmp ) If Not @error Then MsgBox(0, "Achtung", "Diese Datei wurde bereits ausgewählt!") Else If $tmp <> "" And $tmp <> 1 Then $aPath = _PathSplit($tmp, $sDrive, $sDir, $sFName, $sExt) _ArrayAdd($aFullPath, $tmp) ; Array m. kpl. Pfaden aller Anhänge _ArraySort($aFullPath) ; nur auf sortiertes Array _PathSplit() anwendbar GUICtrlSetData($lAttach, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf EndIf EndIf EndFunc Func _AttachDel() Dim $tmp = GUICtrlRead($lAttach), $tmp1, $sDrive, $sDir, $sFName, $sExt, $aPath, $i = 1 If $tmp <> "" Then While UBound($aFullPath) > 0 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) If $sFName & $sExt = $tmp Then _ArrayDelete($aFullPath, $i) ExitLoop EndIf $i = $i +1 WEnd GUICtrlSetData($lAttach, "") For $i = 1 To UBound($aFullPath) -1 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) GUICtrlSetData($lAttach, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf Next EndIf EndFunc Func _GUIclean() GUICtrlSetData($cAdresslist, "") GUICtrlSetData($iBetreff, "") GUICtrlSetData($eMail, "") GUICtrlSetData($lAttach, "") EndFunc Func _Same4All() Dim $tmp, $i ; GUISetState(@SW_MINIMIZE, $GUI_MailSchedul) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(500) Send("^n") ; öffnet Fenster für neue Mail, Cursor im Adressfeld For $i = 1 To UBound($aAdressen) -1 Sleep(1000) Send($aAdressen[$i]) Sleep(150) Send("{DOWN}") Sleep(150) Next Send("{TAB}") ; Betreff $sendBetreff = GUICtrlRead($iBetreff) $tmp = _PlaceHolders($sendBetreff) Send($tmp) If UBound($aFullPath) > 1 Then ; Mail-Anhang For $i = 1 to UBound($aFullPath) - 1 Send("!d") Sleep(150) Send("h") Sleep(150) Send("a") Sleep(300) Send($aFullPath[$i]) Send("{ENTER}") Next EndIf Send("{TAB}") ; Mailtext $sendMail = GUICtrlRead($eMail) $tmp = _PlaceHolders($sendMail) Send($tmp) ; AUSWAHL ABSENDER ???????? ; Send("^{ENTER}") ; versenden ; GUISetState(@SW_RESTORE, $GUI_MailSchedul) EndFunc Func _Diff4All() Dim $i, $tmp $y = UBound($aAdressen) - 1 ReDim $aEZ[$y+1][5] ;;;============ noch in Arbeit ========= EndFunc Func _All4One() Dim $i, $tmp If UBound($aAdressen) > 2 Then MsgBox(0, "Hinweis)", "In diesem Modus darf nur ein Empfänger ausgewählt sein." & @LF & "Bitte korrigieren Sie.") Else $y = UBound($aFullPath) - 1 For $i = 1 To UBound($aFullPath) - 1 ; GUISetState(@SW_MINIMIZE, $GUI_MailSchedul) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(500) Send("^n") ; öffnet Fenster für neue Mail, Cursor im Adressfeld Sleep(1000) Send($aAdressen[2]) Sleep(150) Send("{TAB}") ; Betreff $sendBetreff = GUICtrlRead($iBetreff) $tmp = _PlaceHolders($sendBetreff) Send($tmp) Send("!d") ; Mail-Anhang Sleep(150) Send("h") Sleep(150) Send("a") Sleep(300) Send($aFullPath[$i]) Send("{ENTER}") Send("{TAB}") ; Mailtext $sendMail = GUICtrlRead($eMail) $tmp = _PlaceHolders($sendMail) Send($tmp) ; AUSWAHL ABSENDER ???????? ; Send("^{ENTER}") ; versenden $x = $x + 1 Next ; GUISetState(@SW_RESTORE, $GUI_MailSchedul) EndIf EndFunc Func _PlaceHolders($string) Dim $tmp = StringInStr($string, "{Mail Nr: x}"), $tmp1 = StringInStr($string, "{Mail Nr: x von y}"), $tmp2 = StringInStr($string, "{Dateiname(n) Anhang}") If $tmp <> 0 Then $string = StringReplace($string, "{Mail Nr: x}", "Mail Nr: " & $x,0,1) If $tmp1 <> 0 Then $string = StringReplace($string, "{Mail Nr: x von y}", "Mail Nr: " & $x & " von " & $y,0,1) If $tmp2 <> 0 Then $string = StringReplace($string, "{Dateiname(n) Anhang}", $attachname,0,1) Return $string EndFunc Func _FillEZ() Dim $sDrive, $sDir, $sFName, $sExt, $aPath, $i, $tmp For $i = 1 To UBound($aFullPath) - 1 $tmp = $aFullPath[$i] $aPath = _PathSplit($tmp, $sDrive, $sDir, $sFName, $sExt) GUICtrlSetData($cAttachlistEZ, $sFName & $sExt, $sFName & $sExt) Next GUICtrlSetData($iBetreffEZ, $sendBetreff) GUICtrlSetData($eMailEZ, $sendMail) For $i = 1 To UBound($aAdressen) - 1 If $i = 1 Then GUICtrlSetData($cEmpfEZ, $aAdressen[$i], $aAdressen[$i]) Else GUICtrlSetData($cEmpfEZ, $aAdressen[$i]) EndIf Next EndFunc #endregion Funktionen -
Wie ich sehe, habt ihr auch keine zündende Idee.
Habe jetzt mal eine Anfrage ins Mozilla-Forum eingestellt. Mal sehen, ob die blickig sind.Möchte euch aber nicht vorenthalten, was es eigentlich werden sollte.
Zum Testen bitte die Beta verwenden. Und euren Pfad für TB in "$path" eintragen (Zeile 8 ).Spoiler anzeigen
C
Alles anzeigen#include <GUIConstants.au3> #Include <Misc.au3> #include <Array.au3> #include <file.au3> #region Deklaration Global $absender, $adresse, $i, $aAdressen[1], $attachname = "", $x = 1, $y = 1, $aFullPath[1] $path = "E:\Mozilla Thunderbird\thunderbird.exe" ; Anmerkung zu 1D-Arrays: $array[0] wird nicht belegt, somit erster Eintrag auch auf $array[1] #endregion Deklaration #region GUI $GUI_MailSchedul = GUICreate("Thunderbird Mail Scheduler ", 609, 642, -1, -1) $grAbsender = GUICtrlCreateGroup("Absender", 16, 8, 577, 49) $iAbsender = GUICtrlCreateInput("", 24, 24, 329, 21, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $bAbsChg = GUICtrlCreateButton("Ändern", 496, 24, 89, 22) $grEmpf = GUICtrlCreateGroup("Empfängerliste", 16, 64, 577, 49) $cAdresslist = GUICtrlCreateCombo("", 24, 80, 329, 21) GUICtrlCreateGroup("", -99, -99, 1, 1) $bAdressAdd = GUICtrlCreateButton("Himzufügen", 384, 80, 89, 22) $bAdressDel = GUICtrlCreateButton("Entfernen", 496, 80, 89, 22) $grTextVar = GUICtrlCreateGroup("Textvariablen", 16, 120, 345, 49) $cTextVar = GUICtrlCreateCombo("", 24, 138, 329, 21) GUICtrlSetData(-1, "{Mail Nr: x}", "{Mail Nr: x}") ; Platzhalter, werden bei Versand befüllt GUICtrlSetData(-1, "{Mail Nr: x von y}") ; Platzhalter GUICtrlSetData(-1, "{Dateiname(n) Anhang}") ; Platzhalter GUICtrlCreateGroup("", -99, -99, 1, 1) $grVarZiel = GUICtrlCreateGroup("Variable einfügen in:", 376, 120, 217, 49) $bVarBetreff = GUICtrlCreateButton("Betreff", 384, 138, 89, 22) $bVarMail = GUICtrlCreateButton("Mail", 496, 138, 89, 22) GUICtrlCreateGroup("", -99, -99, 1, 1) $grBetreff = GUICtrlCreateGroup("Betreff", 16, 192, 577, 49) $iBetreff = GUICtrlCreateInput("", 24, 210, 561, 21, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $grMail = GUICtrlCreateGroup("Mail", 16, 248, 577, 209) $eMail = GUICtrlCreateEdit("", 24, 264, 561, 185, -1, $WS_EX_CLIENTEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $shape = GUICtrlCreateGraphic(16, 178, 577, 3, $SS_SUNKEN) $grAttach = GUICtrlCreateGroup("Mail - Anhang", 16, 464, 449, 161) $lAttach = GUICtrlCreateList("", 24, 486, 297, 149, -1, $WS_EX_CLIENTEDGE) $rAttachSame = GUICtrlCreateRadio("Für alle gleich", 352, 486, 105, 17) GUICtrlSetState(-1, $GUI_CHECKED) $rAttachDiff = GUICtrlCreateRadio("Für jeden anders", 352, 509, 105, 17) $bAttachAdd = GUICtrlCreateButton("Hinzufügen", 352, 560, 89, 22) $bAttachDel = GUICtrlCreateButton("Entfernen", 352, 587, 89, 22) $rAll4One = GUICtrlCreateRadio("an eine Adresse nacheinander", 352, 525, 97, 33, $BS_MULTILINE) GUICtrlCreateGroup("", -99, -99, 1, 1) $bClean = GUICtrlCreateButton("Auswahl löschen", 488, 472, 105, 25) $bEscape = GUICtrlCreateButton("Abbrechen", 488, 507, 105, 25) $cbDownPC = GUICtrlCreateCheckbox("PC Herunterfahren nach Versand", 488, 542, 105, 50, $BS_MULTILINE) $bSend = GUICtrlCreateButton("Senden", 488, 600, 105, 25) GUISetState(@SW_SHOW) #endregion GUI #region Code Opt("WinTitleMatchMode",2) While 1 $msg = GuiGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $bEscape ExitLoop Case $msg = $bAbsChg _AbsChg() Case $msg = $bAdressAdd _AdressAdd() Case $msg = $bAdressDel _AdressDel() Case $msg = $bVarBetreff _InVarBetreff() Case $msg = $bVarMail _InVarMail() Case $msg = $bAttachAdd _AttachAdd() Case $msg = $bAttachDel _AttachDel() Case $msg = $bClean _GUIclean() Case $msg = $bSend $modeSame = GUICtrlRead($rAttachSame) $modeDiff = GUICtrlRead($rAttachDiff) $modeOne = GUICtrlRead($rAll4One) Select Case $modeSame = 1 ;_Same4All() ; Text und Anhang für alle gleich Case $modeDiff = 1 ;_Diff4All() ; Text und Anhang für jede Adresse individuell Case $modeOne = 1 ;_All4One() ; einzelner Empfänger erhält jeweils Mail + 1 Anhang bis Anhangliste leer (für gesplittete Anhänge) EndSelect If GUICtrlRead($cbDownPC) = 1 Then ;PC Herunterfahren EndIf EndSelect WEnd Exit #endregion Code #region Funktionen Func _AbsChg() GUISetState($GUI_MailSchedul, @SW_HIDE) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(500) Send("!b") Sleep(50) Send("g") MsgBox(0,"Absenderkonto","Bitte klicken Sie in der linken Spalte" & @LF & @LF & "auf das Absenderkonto." & @LF & @LF & @LF & "Bestätigen Sie die Auswahl mit <F9> !") While _IsPressed("78") = 0 ; Warten bis User-Auswahl beendet und <F9> gedrückt Sleep(150) WEnd Send("!e") Sleep(50) Send("+{HOME}") Send("^c") $absender = ClipGet() GUICtrlSetData($iAbsender, $absender) Send ("+{TAB}") Send ("+{TAB}") ; wechseln zum Kontonamen Send("^c") $konto = ClipGet() Send("{ESC}") Sleep(50) Send("!{F4}") GUISetState($GUI_MailSchedul, @SW_RESTORE) EndFunc Func _AdressAdd() Dim $state = 1, $weiter GUISetState($GUI_MailSchedul, @SW_HIDE) Run($path) WinWaitActive("Mozilla Thunderbird") Sleep(50) Send("^2") ; öffnet Adressbuch WinWaitActive("Adressbuch") MsgBox(0,"Zieladresse","Bitte Doppelklick auf gewünschte Adresse im Adressbuch!") Do ClipPut("") WinWaitActive("Karte") Sleep(250) Send("{TAB 4}") ; markiert Adresse Sleep(100) Send("^c") ; kopieren $adresse = ClipGet() Send("{ESC}") If $adresse <> "" Then GUICtrlSetData($cAdresslist, $adresse, $adresse) _ArrayAdd($aAdressen, $adresse) Else MsgBox(0,"Hinweis", "Auswahl Adresseintrag ist fehlgeschlagen!") EndIf $weiter = MsgBox(4,"gewählte Adresse: " & $adresse, "..weitere Adresse auswählen?") If $weiter = 7 Then Send("^q") ; nein (ja = 6) $state = WinGetState("Adressbuch") Until $state = 0 Send("!d") Send("b") GUISetState($GUI_MailSchedul, @SW_RESTORE) EndFunc Func _AdressDel() Dim $tmp = GUICtrlRead($cAdresslist), $i = 1 While UBound($aAdressen) > 0 If $aAdressen[$i] = $tmp Then _ArrayDelete($aAdressen, $i) ExitLoop EndIf $i = $i +1 WEnd GUICtrlSetData($cAdresslist, "") For $i = 1 To UBound($aAdressen) -1 GUICtrlSetData($cAdresslist, $aAdressen[$i], $aAdressen[$i]) Next EndFunc Func _InVarBetreff() Dim $tmp = GUICtrlRead($cTextVar), $tmp1 = GUICtrlRead($iBetreff) $tmp = $tmp1 & " " & $tmp $tmp = StringStripWS($tmp, 1) GUICtrlSetData($iBetreff, $tmp) EndFunc Func _InVarMail() Dim $tmp = GUICtrlRead($cTextVar), $tmp1 = GUICtrlRead($eMail) $tmp = $tmp1 & " " & $tmp $tmp = StringStripWS($tmp, 1) GUICtrlSetData($eMail, $tmp) EndFunc Func _AttachAdd() Dim $tmp, $sDrive, $sDir, $sFName, $sExt, $aPath $tmp = FileOpenDialog("",@HomePath, "Alle (*.*)") $iKeyIndex = _ArrayBinarySearch ( $aFullPath, $tmp ) If Not @error Then MsgBox(0, "Achtung", "Diese Datei wurde bereits ausgewählt!") Else If $tmp <> "" And $tmp <> 1 Then $aPath = _PathSplit($tmp, $sDrive, $sDir, $sFName, $sExt) _ArrayAdd($aFullPath, $tmp) ; Array m. kpl. Pfaden aller Anhänge _ArraySort($aFullPath) ; nur auf sortiertes Array _PathSplit() anwendbar GUICtrlSetData($lAttach, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf EndIf EndIf EndFunc Func _AttachDel() Dim $tmp = GUICtrlRead($lAttach), $tmp1, $sDrive, $sDir, $sFName, $sExt, $aPath, $i = 1 If $tmp <> "" Then While UBound($aFullPath) > 0 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) If $sFName & $sExt = $tmp Then _ArrayDelete($aFullPath, $i) ExitLoop EndIf $i = $i +1 WEnd GUICtrlSetData($lAttach, "") For $i = 1 To UBound($aFullPath) -1 $tmp1 = _PathSplit($aFullPath[$i], $sDrive, $sDir, $sFName, $sExt) GUICtrlSetData($lAttach, $sFName & $sExt) If $attachname = "" Then $attachname = $sFName & $sExt Else $attachname = $attachname & ", " & $sFName & $sExt EndIf Next EndIf EndFunc Func _GUIclean() GUICtrlSetData($cAdresslist, "") GUICtrlSetData($iBetreff, "") GUICtrlSetData($eMail, "") GUICtrlSetData($lAttach, "") EndFunc #endregion Funktionen -
Kann gut sein, dass der Zufall es wollte und ich bisher nur mit ebendiesen mehrdimensionalen Arrays gewerkelt habe. Muß ich in Zukunft mal drauf achten.
-
Die blöden Eindimensionalen Arrays bieten von Haus aus nix.
Must halt mit 'Ubound' die Obergrenze abfragen.
Bei den mehrdimensionalen Arrays hast du die Anzahl der Elemente in $array[0][0]Edit:
Und schon wieder war Pee schneller! Naja, Hauptsache Problem gelöst. -
Hi,
ich bastele grade an meinem seeeeehr komfortablen
Mailscheduler für Thunderbird. Etwa 60 % der Arbeit sind schon erledigt und jetzt hänge ich eigentlich am wichtigsten: Einfügen des Absenders bzw. Auswahl per Tastaturbefehl/kombination.
Ich habe noch keine Möglichkeit gefunden per Tastatur eine im Vorfeld festgelegte Absenderadresse auszuwählen. Bei nur einem Konto wäre das egal - aber wer hat das schon.
Und TB ist völlig Control-resistent
Wenn ich hier nicht weiterkomm, kann ich das ganze Projekt in die Tonne treten. Wär echt schade.
Also falls jemand einen goldigen Einfall hat...Edit:
Ich war vielleicht etwas ungenau:
Also die Absenderadresse liegt in einer Variable vor. Jetzt wird TB gestartet, 'Neue Nachricht' ausgewählt und in das Feld für Absender möchte ich jetzt die Adresse aus der Variablen haben/einfügen/auswählen -wie auch immer. -
Wer lange sucht, der findet.
2 Ursachen:
1. Opt(WinTitleMatchMode, 4) funktioniert hier nicht optimal, habe Flag 2 gesetzt und damit wurden erstmal die Fenster richtig erkannt.
2. Ich hatte vorgesehen, dass der Nutzer mit Klick aufs Kreuz das Adressbuch wieder schließt.
Paradoxerweise tritt dann das Programm nicht aus der Schleife, obwohl Status = 0.
Wird das Adressbuch mit Tastaturbefehl STRG+Q geschlossen, wird die Schleife ordnungsgemäß beendet!
Warum? - Ich hab keinen Schimmer.
Hier der funktionierende Code:Spoiler anzeigen
Code
Alles anzeigenFunc _AdressAdd() Dim $state = 1, $weiter GUISetState($GUI_MailSchedul, @SW_HIDE) Run($path) WinWaitActive("Mozilla") Sleep(50) Send("^2") ; öffnet Adressbuch WinWaitActive("Adressbuch") MsgBox(0,"Zieladresse","Bitte Doppelklick auf gewünschte Adresse im Adressbuch!") Do WinWaitActive("Karte") Sleep(250) Send("{TAB 4}") ; markiert Adresse Send("^c") ; kopieren $adresse = ClipGet() Send("{ESC}") GUICtrlSetData($cAdresslist, $adresse, $adresse) $weiter = MsgBox(4,"","..nächste Adresse auswählen?") If $weiter = 7 Then Send("^q") ; nein (ja = 6) $state = WinGetState("Adressbuch") Until $state = 0 Send("!d") Send("b") GUISetState($GUI_MailSchedul, @SW_RESTORE) EndFunc -
Ja, "Adressbuch" ist der volle Name.
-
Hi,
schaut mal den folgenden Code an. Ich habe als Abbruchbedingung der Schleife: Fenster wird geschlossen
Habe das auch probiert mit " while $state <>0 ..... wend ". Aber seltsamerweise kann ich nicht aus der Schleife raus. Wenn ich mir mit MessageBox den Wert von $state anzeigen lasse, ist der auch '0'.
Hat jemand 'ne Idee?Spoiler anzeigen
Code
Alles anzeigenFunc _AdressAdd() Opt("WinTitleMatchMode",4) Dim $state = 1 Run($path) WinWaitActive("classname=MozillaWindowClass") Sleep(500) Send("^2") WinWaitActive("Adressbuch") MsgBox(0,"Zieladresse","Bitte Doppelklick auf gewünschte Adresse im Adressbuch!" & @LF & @LF & @LF & "Sollen keine weiteren Adressen hinzugefügt werden,"& @LF & @LF & "schließen Sie bitte das Adressbuch!") Do WinWaitActive("Karte") Sleep(150) Send("{TAB 4}") ; markiert Adresse Send("^c") ; kopieren $adresse = ClipGet() Send("{ESC}") GUICtrlSetData($cAdresslist, $adresse, $adresse) MsgBox(0,"","..nächste Adresse oder beenden", 2) $state = WinGetState("Adressbuch") Until $state = 0 Send("!d") Send("b") GUISetState($GUI_MailSchedul, @SW_RESTORE) EndFunc -
Das Prinzip von OOP hat sich nicht geändert, insofern kannst du als Grundlage auch Lehrmittel aus 2001 nutzen.
Ich hatte mir zum Lernen eine Version von Visual Basic zugelegt, die den vollen Funktionsumfang enthält aber Compilieren nicht zuläßt. Man kann seine Programme also nur in der Entwicklungsumgebung testen. Reicht aber zum Erlernen aus.
Der Umgang mit Objekten, Klassen, Methoden... ist nicht ohne und gerade am Anfang recht verwirrend. Besonders, wenn man vorher mit Fortran, Turbopascal 4 u.ä. gearbeitet hat.
Also laß dich nicht entmutigen und hau rein - du kannst nur gewinnen.
Edit:
Hab hier ein Tut gefunden. Vielleicht nützt es dir. -
Zitat
Es soll wohl sogar die Möglichkeit bestehen diese Liste seine Bedürfnissen anzupassen, nur bin ich noch nicht dahinter gekommen wie das geht.
Schaut erstmal nach, ob das überhaupt nötig ist
, denn eigentlich ist ja schon alles drin.
Öffnet in SciTE die Datei "..\SciTE\au3abbrev.properties". Hier findet ihr die komplette Auflistung in der FormWenn ihr also etwas erweitern möchtet, prüft mit Suchbefehl ob das Kürzel noch frei ist und fügt es dann mit der Befehlsfolge in obiger Form in der entsprechenden Gruppe oder einer eigenen (z.B. #; -- UserDef -- ) ein.
Edit:
Ihr könnt allerdings einige Vorlagen an eure Einstellungen anpassen, z.B. die Funktionsbeschreibung läßt sich mit "setupudf" erstellen, sieht dann so aus:Code
Alles anzeigen;=============================================================================== ; ; Function Name: ; Description:: ; Parameter(s): ; Requirement(s): ; Return Value(s): ; Author(s): ; ;=============================================================================== ;Hier läßt sich schonmal der Autor eintragen und natürlich kann man dann auch deutsch schreiben. =)
-
-
Vielleicht noch als Ergänzung:
Den Namen des Fensters und u.U. auch die der Controls, kannst du mit dem Tool "AutoIt Window Info" (enthalten in Programmgruppe 'AutoIt v3') auslesen. Evtl. hat das Fenster auch keinen Namen. Sofern es zur Laufzeit das einzige 'namenlose' ist, ist es somit eindeutig identifizier- und ansprechbar. Mausklicks solltest du wirklich nur dann ausführen, wenn Steuerung über Controls oder mit Send() nicht realisierbar ist. -
Hi,
da du sagst, Bernds Lösung ist nicht das, was du meinst, ist mir ehrlich gesagt nicht ganz klar, was du geanau möchtest.
Stell doch mal ein Beispiel ein: Welches ist der Ausgangsstring, was möchtest du selektieren?z.B.
$string = "1234567890"
$n = variable Anzahl zu selektierender Zeichen ($n = 2)
$instring = "5"wenn $instring in $string enthalten, dann Rückgabe $n Zeichen links davon
Ergebnis hier: "34"
Meinst du sowas?
-
Hi,
habe meinen ersten Urlaubstag mal dazu genutzt, ein Startwiederholungsscript für Carom3D zu schreiben. D.h., das Script hatte ich ja schon - jetzt hab ich es nur allgemeingültig umgebastelt, mit INI für die Einstellungen.Spoiler anzeigen
SETTINGS:
Code
Alles anzeigen#include <GuiConstants.au3> Global $butt_x, $butt_y, $var, $path, $game, $c_game, $room, $c_room, $i If FileExists(@ScriptDir & "\" & "carom_again.INI") Then $path = IniRead(@ScriptDir & "\" & "carom_again.INI", "path", "appl", "") $var = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "practicebutton") $butt_x = $var[1][1] $butt_y = $var[2][1] $game = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "game") $room = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "room") Else MsgBox(4096, "Achtung ! Fehlende Datei!", "Die Datei: <carom_again.INI> ist nicht im Ordner: <" & @ScriptDir & "\" & "> enthalten!" & @LF & @LF & "Ohne diese Datei kann das Programm nicht ausgeführt werden!") Exit EndIf $gui= GuiCreate("Einstellungen Carom3D mit Wiederholung", 392, 329,-1, -1 , BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS)) $Group_appl = GuiCtrlCreateGroup("Anwendung", 30, 10, 340, 50) $Input_appl = GuiCtrlCreateInput("", 40, 30, 220, 20) $Button_appl_chg = GuiCtrlCreateButton("Ändern", 280, 30, 80, 20) $Group_button = GuiCtrlCreateGroup("Position <PRACTICE> Button", 30, 80, 340, 50) $Input_button = GuiCtrlCreateInput("", 40, 100, 220, 20) $Button_button_chg = GuiCtrlCreateButton("Ändern", 280, 100, 80, 20) $Group_game = GuiCtrlCreateGroup("Game Typ", 30, 150, 340, 50) $Combo_game = GuiCtrlCreateCombo("", 40, 170, 320, 21) $Group_room = GuiCtrlCreateGroup("Room Typ", 30, 220, 340, 50) $Combo_room = GuiCtrlCreateCombo("", 40, 240, 320, 21) $Button_esc = GuiCtrlCreateButton("Abbrechen", 30, 290, 110, 20) $Button_set = GuiCtrlCreateButton("Übernehmen", 260, 290, 110, 20) _FillCombos() GUICtrlSetData($Input_appl, $path) GUICtrlSetData($Input_button, "x: " & $butt_x & ", y: " & $butt_y) GuiSetState() While 1 $msg = GuiGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Or $msg = $Button_esc ExitLoop Case $msg = $Button_appl_chg $var = FileOpenDialog("","C:\Program Files\Carom3D\", "(*.exe)") If $var <> "" And $var <> 1 Then GUICtrlSetData($Input_appl, $var) EndIf Case $msg = $Button_button_chg HotKeySet("!y", "_MausPos") ; Hotkey für Bestätigung <ALT>+<y> MsgBox(0,"Position 'PRACTICE' - Button", "Bitte Carom3D starten!" & @LF & @LF & "Den Mauszeiger mittig über dem <PRACTICE> Button positionieren (NICHT klicken!)." & @LF & @LF & "Die Position mit <ALT>+<y> bestätigen.") GUISetState(@SW_MINIMIZE, $gui) WinWaitActive($gui) HotKeySet("!y", "_Blind") Case $msg = $Button_set $path = GUICtrlRead($Input_appl) $c_game = GUICtrlRead($Combo_game) $c_room = GUICtrlRead($Combo_room) If $c_game = "6-Ball" Or $c_game = "9-Ball" Or $c_game = "Rotation" Or $c_game = "Normal-Snooker" Or $c_game = "Short-Snooker" Then MsgBox(4096, "Hinweis", "Für das gewählte Spiel: <" & $c_game & "> muß der Anwendungspfad auf" & @LF & @LF & "die Installation: Carom3D-Full-Practice verweisen." & @LF & @LF & "Sollte das nicht der Fall sein, wird das Tool nicht funktionieren.") EndIf _WriteINI() Exit EndSelect WEnd Exit Func _FillCombos() Dim $c_game = $game[10][1], $c_room = $room[9][1], $tmp GUICtrlSetData($Combo_game, "") For $i = 1 To $game[0][0]-1 $tmp = $game[$i][0] GUICtrlSetData($Combo_game, $tmp, $c_game) Next GUICtrlSetData($Combo_room, "") For $i = 1 To $room[0][0]-1 $tmp = $room[$i][0] GUICtrlSetData($Combo_room, $tmp, $c_room) Next EndFunc Func _MausPos() $pos = MouseGetPos() $butt_x = $pos[0] $butt_y = $pos[1] GUICtrlSetData($Input_button, "x: " & $butt_x & ", y: " & $butt_y) GUISetState(@SW_RESTORE, $gui) EndFunc Func _WriteINI() IniWrite(@ScriptDir & "\" & "carom_again.INI", "path", "appl", $path) IniWrite(@ScriptDir & "\" & "carom_again.INI", "practicebutton", "pos_x", $butt_x) IniWrite(@ScriptDir & "\" & "carom_again.INI", "practicebutton", "pos_y", $butt_y) IniWrite(@ScriptDir & "\" & "carom_again.INI", "game", "Current_Game", $c_game) IniWrite(@ScriptDir & "\" & "carom_again.INI", "room", "Current_Room", $c_room) IniWrite(@ScriptDir & "\" & "carom_again.INI", "set", "done", 1) EndFunc Func _Blind() ; ohne Funktion - nur Aufhebung Hotkey EndFuncWIEDERHOLUNGSSCRIPT
Code
Alles anzeigen#NoTrayIcon Dim $state, $aktiv, $butt_x, $butt_y, $var, $path, $game, $c_game, $key_game, $room, $c_room, $key_room, $i If FileExists(@ScriptDir & "\" & "carom_again.INI") Then $var = IniRead(@ScriptDir & "\" & "carom_again.INI", "set", "done", "") If $var = 0 Then MsgBox(4096, "Achtung", "Die 'carom_again_settings' müssen zumindest einmal ausgeführt" & @LF & @LF & "und an deine Installation angepaßt werden." & @LF & @LF & @LF & @LF & "Das Einstellungsprogramm wird jetzt aufgerufen.") Run(@ScriptDir & "\" & "carom_again_settings.exe") If @error Then MsgBox(4096, "Achtung!", "Das Einstellungsprogramm: 'carom_again_settings.exe' ist nicht im Installationspfad: " & @ScriptDir & "\" & "vorhanden!" & @LF & @LF & "Das Programm wird jetzt beendet.") Exit EndIf While $var = 0 Sleep(250) $var = IniRead(@ScriptDir & "\" & "carom_again.INI", "set", "done", "") WEnd EndIf $path = IniRead(@ScriptDir & "\" & "carom_again.INI", "path", "appl", "") $var = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "practicebutton") $butt_x = $var[1][1] $butt_y = $var[2][1] $game = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "game") $c_game = $game[10][1] $room = IniReadSection(@ScriptDir & "\" & "carom_again.INI", "room") $c_room = $room[9][1] Else MsgBox(4096, "Achtung ! Fehlende Datei!", "Die Datei: <carom_again.INI> ist nicht im Ordner: <" & @ScriptDir & "\" & "> enthalten!" & @LF & @LF & "Ohne diese Datei kann das Programm nicht ausgeführt werden!") Exit EndIf HotKeySet("!y", "_CaromStart") $aktiv = 0 For $i = 1 To $game[0][0]-1 If $game[$i][0] = $c_game Then $key_game = $game[$i][1] ExitLoop EndIf Next For $i = 1 To $room[0][0]-1 If $room[$i][0] = $c_room Then $key_room = $room[$i][1] ExitLoop EndIf Next MsgBox(4096, "Hinweis", "Es startet jetzt automatisch das voreingestellte Spiel im voreingestellten Raum." & @LF & @LF & "Nach Beendigung des Spiels, kann mit der Tastenkombination:" & @LF & @LF & "< ALT > + < y >" & @LF & @LF & "sofort ein neues Spiel begonnen werden." & @LF & @LF & @LF & @LF & "© Frank Stahlke 2006" & @LF & @LF & "eMail: bug_fix@web.de" & @LF & @LF & "Created with AutoIt3") While 1 Sleep(500) $state = WinGetState("Carom3D", "") Select Case $state = 0 And $aktiv = 1 ExitLoop Case $aktiv = 0 ; Practice Mode Run($path) If @error Then MsgBox(4096, "Achtung", "Programmpfad der Anwendung: " & $path & " ist nicht vorhanden!") Exit EndIf WinWaitActive("Carom3D") Sleep(1000) $aktiv = 1 _CaromStart() EndSelect WEnd Exit Func _CaromStart() BlockInput(1) MouseClick("left",$butt_x,$butt_y,1,0) Send($key_game) Send("{TAB}") Send($key_room) Send("{ENTER}") BlockInput(0) EndFuncINI
Code
Alles anzeigen[path] appl=C:\Program Files\Carom3D\carom.exe [practicebutton] pos_x=536 pos_y=178 [game] 3-Cushion=3 4-Ball=4 6-Ball=6 8-Ball=e 9-Ball=9 CardBall=c Rotation=r Short-Snooker=s Normal-Snooker=n Current_Game=8-Ball [room] Underground=u Japanese=j Korean=k Millennium=m Christmas=c Event=e Antique=a CaromBeach={PGDN} Current_Room=Korean [set] done=0
Damit ich die INI-Datei anhängen konnte, hab ich ihr noch den Suffix .txt verpaßt. Bei Nutzung also wieder entfernen.Und das ganze mit der Beta nutzen. Gute Nacht auch noch.
Edit:
Kleine Änderung - ich hatte glatt Snooker vergessen einzubauen. Jetzt ist aber alles komplett.Edit 2:
Aus mir nicht erklärlichen Gründen funktioniert das BlockInput() (Script: carom_again.au3; Zeilen: 65 bis 73) nicht. Der User kann beim Erststart die Maus munter bewegen, sodass die gesendeten Befehle verpuffen.
Hängt vermutlich damit zusammen, dass vorm Aufruf der Funktion zwar mit WinWaitActive() (Zeile 58 ) auf das Fenster gewartet wird, dieses jedoch noch nicht komplex aufgebaut ist (die Befehle somit ins Leere gehen).
Ich habe jetzt hinter das WinWaitActive() noch ein Sleep(800) gesetzt und nun funktioniert es auch. Wobei 800 ms die untere Grenze ist. Ich denke mit 1 s ist man absolut auf der sicheren Seite.