1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Gui show bei WinActiv und Gui hide bei WinClose

    • misterspeed
    • 2. Dezember 2017 um 13:06

    Naja erstmal brauchst du eindeutige Identifikationsmerkmale des Fensters. Davon seh ich in deinem Script bisher nichts. Stattdessen seh ich da nur einen Syntaxfeher.

    Schau dir das Tool "Au3Info" in Scite an. Damit ermittelst du erstmal die notwendigen Informationen des Fensters. Wenn du Pech hast verwendet Lexware aber keine Standard Fensterklassen von Windows, dann wirds etwas schwieriger die gewünschten Informationen (Kundennummer) zu ermitteln.

    Grundsätzlich ist deine Vorgehensweise aber richtig.

    1. Warten bis das Lexware Unterfenster sichtbar/aktiv wird

    2. Kundennummer auslesen

    3. Eigene GUI aktualisieren und anzeigen

    Hier mal eine abgewandelte Version deines Scripts. Sobald ein neues Notepad Fenster sichtbar ist kopiert das Testscript den Inhalt des Notepad Eingabefeldes und gibt das Ganze in der Scite Konsole aus.

    Dein Script funktioniert prinzipiell also. Es fehlen lediglich Detailangaben zum Fenster und Control.

    AutoIt
    #include <GUIConstantsEx.au3>
    ;#include <MsgBoxConstants.au3>
    
    ;$hGui = GUICreate("test", 200, 200,1,1)
    
    While sleep (1000)
        Switch WinActive ("Unbenannt - Editor", "")
            Case True
                $sText = ControlGetText("Unbenannt - Editor", "", "[CLASS:Edit; INSTANCE:1]")
                _Show($sText)
            Case False
                _Hide()
        EndSwitch
    WEnd
    
    Func _Show($sShow)
        ;GUISetState(@SW_SHOW, $hGui)
        ;GUICtrlCreatePic($sText & ".jpg",1,1)
        ConsoleWrite($sShow & @CRLF)
    EndFunc
    
    Func _Hide()
        ;GUISetState(@SW_Hide, $hGui)
        Sleep(100)
    EndFunc
    Alles anzeigen
  • Browserfenster als anderer User(Kontext) öffnen

    • misterspeed
    • 1. Dezember 2017 um 18:05

    Dein Script läuft standardmässig erstmal im Kontext des angemeldeten Benutzers.

    Du könntest dein Script aber alternativ auch komplett im Kontext eines anderen Benutzers starten (Shift-Taste gedrückt halten + Rechtsklick auf die EXE -> "Als anderer Benutzer ausführen").

    Wenn das auch wieder Probleme macht, weil ja eigentlich alles bis auf die IE Geschichte im Testuserkontext laufen soll kannst du den IE Teil in ein separetes Script auslagern und dieses zweite Script vom Hauptscript aus mit runas(...) im Kontext eines anderen Benutzers starten. Jenachdem was deine Scripte machen sollen ist dann evtl. noch eine Kommunikation zwischen beiden Scripten notwendig. Um zwei EXE Dateien zu vermeiden kannst du theoretisch auch dein Hauptscript mit cmdline Parametern ausstatten und sich selbst mit Parameter als zweite Instanz starten lassen. Bei Start mit Parameter springt das Script dann direkt zur Funktion mit deinen IE Interaktionen. Letztlich aber auch nicht wirklich besser als ein völlig unabhängiges zweites Script.

    Problematisch daran sehe ich allerdings, dass du Zugangsdaten des "höher berechtigten" Users vermutlich im Quellcode speichern willst. Sowas muss zwingend entfernt werden wenn du das Script später produktiv nutzt. Da man solchen Debug/Testcode gern mal vergisst oder gar drin lässt um die Weiterentwicklung zu vereinfachen ist das aus Sicherheitssicht eher unschön.

    PS: Warum berechtigst du den Testuser nicht einfach für Citrix, so wäre es wenigstens ein realistischer Test und du musst nicht irgendwelchen Testcode programmieren der im Realeinsatz nie so ausgeführt wird. Alleine durch die Benutzerkontextwechsel können seltsame Fehler und Probleme entstehen.

    Im Idealfall ist dein Testuser, Testrechner und Testnetzwerk genau so wie bei allen Anderen auch die das Script später nutzen.

  • Makro starten

    • misterspeed
    • 24. November 2017 um 21:27

    Ich kürz das nun mal ein wenig ab... denke so ist es verständlicher wie der Aufbau gemeint war:

    Spoiler anzeigen
    AutoIt
    #include <array.au3>
    #include <WindowsConstants.au3>
    
    ; Globale Variablen deklarieren und initialisieren:
    Global $aMyActionAreas[4][5] = [    ["Actionsnummer/Makronummer","xStart","xEnd","yStart","yEnd"], _
                                    [1, 957, 1132, 305, 349], _
                                    [2, 757, 832,  305, 349], _
                                    [3, 400, 555,  305, 349] _
                                ]
    ;_ArrayDisplay($aMyActionAreas)
    Global $sMyFilepath = "C:\test\test.txt"
    
    ; Test GUI erstellen:
    showMyAreas($aMyActionAreas) ; macht das testen einfacher...
    
    ; Hauptschleife deines Programms:
    While 1
        $iMyAction = mousePosAction($aMyActionAreas) ; Zurückgegebenes Ergebnis wird in Variable gespeichert
        If $iMyAction = 0 Then
            Sleep(50) ; 50ms schlafen, vielleicht gibts ja dann was zu tun!
        Else
            ; endlich was zu tun...
            ConsoleWrite($iMyAction & @CRLF) ; 1 oder 2 oder 3???
    ;~         openTXT($sMyFilepath) ; TXT in Excel öffnen
    ;~         executeExcelMakro($iMyAction) ; das passende Makro ausführen!
    ;~         closeExcel() ; Excel wieder beenden???
            MouseMove(100,100,0) ; Maus außerhalb deiner Bereiche platzieren, damit Aktion nicht gleich nochmal ausgeführt wird
        EndIf
    WEnd
    
    ; Funktionen:
    Func showMyAreas($aAreas)
        For $i = 1 To UBound($aAreas)-1
            GUICreate("Bereich " & $i,$aAreas[$i][2]-$aAreas[$i][1],$aAreas[$i][4]-$aAreas[$i][3],$aAreas[$i][1],$aAreas[$i][3],BitOR($WS_POPUP,$DS_SETFOREGROUND),$WS_EX_TOPMOST)
            GUICtrlCreateLabel("Bereich " & $i,-1,-1)
            GUISetBkColor(0xAA3456)
            GUISetState(@SW_SHOW)
        Next
    EndFunc
    
    Func mousePosAction($aAreas)
        Local $iActionNumber = 0 ; auszuführende Aktion
        Local $aMpos = MouseGetPos() ; aktuelle Mausposition
    
        For $i = 1 To UBound($aAreas)-1 ; für alle Bereiche im Array
            If $aMpos[0] >= $aAreas[$i][1] And $aMpos[0] <= $aAreas[$i][2] And $aMpos[1] >= $aAreas[$i][3] And $aMpos[1] <= $aAreas[$i][4] Then ; Maus ist innerhalb des Bereichs $i
                $iActionNumber = $aAreas[$i][0] ; gefundene Aktion auslesen und speichern
                ExitLoop ; wir haben den Bereich schon gefunden, die anderen Bereiche brauchen wir nicht mehr prüfen, also brechen wir hier ab!
            EndIf
        Next
    
        ; die Aktion ist nun entweder immernoch 0, weil die Maus in keinem der definierten Bereiche war
        ; oder sie ist 1 bzw. 2 bzw. 3, jenachdem in welchem Bereich deine IF Bedingung erfüllt war
        
        Return $iActionNumber ; Funktion verlassen und das ermittelte Ergebnis zurückgeben
    EndFunc
    
    Func openTXT($sFile)
        ;... kannst selber programmieren
    EndFunc
    
    Func executeExcelMakro($iAction)
        ;... kannst selber programmieren
    EndFunc
    
    Func closeExcel()
        ;... kannst selber programmieren
    EndFunc
    Alles anzeigen
  • Makro starten

    • misterspeed
    • 23. November 2017 um 19:08
    Zitat von Vitaq

    If $aPos = $aActionAreas[0][1] then

    Bedenke bitte, dass dein Array in Zeile 0 keine Bereichs Koordinaten enthält, sondern nur die Überschriften des Arrays (zumindestens wenn du dich Aufgrund meines Tipps dazu entschieden hast Überschriften zu speichern).

  • Makro starten

    • misterspeed
    • 23. November 2017 um 19:06
    Zitat von Vitaq

    Local $iActionNumber = "0" hab das eingetragen sollte passen

    Passt im Übrigen nicht ganz, auch wenn es zufällig keinen Unterschied macht.

    Alles was du in Anführungszeichen setzt interpretiert Autoit als String und nicht als Zahl, bzw intern wird ein String als die Zahl 0 interpretiert. Deswegen passt das hier zufälligerweise.

    Zahlen solltest du aber um Probleme bei logischen Vergleichen zu vermeiden immer ohne Anführungszeichen in Variablen/Arrays speichern. Ansonsten wunderst du dich irgendwann warum deine IF Bedingung immer ein falsches Ergebnis liefert statt dem von dir erwarteten.

  • Makro starten

    • misterspeed
    • 23. November 2017 um 18:59
    Zitat von Vitaq
    Code
    $aPos ist ein Array, keine Variable.

    Und das heisst was?

    In der Hilfe die Funktion mousegetpos() anschauen.

    Dort steht unter anderem:

    Zitat

    Returns a two-element array that containing the mouse coordinates: $array[0] = X coord (horizontal), $array[1] = Y coord (vertical)


    So die Funktion sagt dir also die Xmaus Koordinate und Ymaus Koordinate, welche jeweils in einem Element des mousegetpos Arrays gespeichert ist.

    Deine eigene Funktion soll nun prüfen ob die Maus innerhalb der Bereiche liegt.

    In deinem eigenen Array hast du die minimalen und maximalen X bzw. Y Koordinaten jedes Bereichs gespeichert.

    Deine Funktion muss nun also prüfen ob:

    - (Xmaus größer Xmin UND Xmaus kleiner Xmax) UND (Ymaus größer Ymin UND Ymaus kleiner Ymax) ist -> korrekt wäre im Übrigen statt "<" bzw ">" ein "<=" bzw. ">=" ein Pixel hin oder her spielt aber nicht wirklich eine Rolle

    - wenn ja liegt die Maus im Bereich, wenn nein liegt sie irgendwo anderst

    Diese Prüfung musst du für alle gespeicherten Bereiche in deinem eigenen Array machen. Sowas hab ich im Übrigen in deinem allerersten Script schon gesehen.

  • Makro starten

    • misterspeed
    • 21. November 2017 um 22:06

    Tuxedo hat natürlich recht, dass man das alles auch etwas kompakter und direkter programmieren kann. Ich hab das hier aber bewusst nicht vorgeschlagen, damit es verständlicher und Übersichtlicher bleibt und verschiedene Teilaufgaben klar voneinander getrennt bleiben. Das erleichtert es hier auf Detail- / Anfängerfragen besser einzugehen und man sieht immer wieder kleine Erfolgserlebnisse (z.B. dass der Bereich nun korrekt und live in der console angegeben wird), Davon ab ist das Vorgehen für komplexere und größere zukünftige Scripte hilfreich. Optimieren kann man ein funktionstüchtiges Script immer auch im Nachhinein.

    Zuviel auf einmal führt zu Fehlern und Frustation wenns eben nicht sofort alles funktioniert. Ich glaub wir wollen alle nicht, dass seine Hauptschleife endlos Excelinstanzen startet und seinen Rechner nach wenigen Sekunden zum Absturz bringt. :P

  • Makro starten

    • misterspeed
    • 21. November 2017 um 21:41
    Zitat von Vitaq

    Hast du vielleicht einen Tipp an was ich mich orientieren kann

    Inwiefern? In der Autoithilfe findest du unter Sprachreferenz ein simples Beispiel zum Erstellen einer Funktion mit Parameter und Rückgabewert. Was die eigentliche Aufgabe angeht kannst du dich ja am bisherigen Code orientieren.

    Deine Funktion muss grob folgendes tun:

    0. Rückgabe Variable $iActionNumber lokal in der Funktion deklarieren und den Wert 0 (kein Treffer, Maus außerhalb der Bereiche) zuweisen

    1. Mausposition ermitteln

    2. Für alle im Array definierten Bereiche prüfen ob die ermittelte Mausposition innerhalb des jeweiligen Bereichs ist, Sobald du einen Treffer hast setzt du deine Rückgabevariable auf die zugehörige "ActionNumber" der Array Zeile und verlässt die Schleife mit dem Statement exitloop, damit unnötige weitere Prüfungen vermieden werden. Für diesen Teil solltest du dir im Array Tutorial den Umgang mit Schleifen und Arrays nochmal anschauen.

    3. Nun gibst du dein Ergbnis mittels Return $iActionNumber zurück und verlässt die Funktion

    Zum Überprüfen deiner Funktion empfiehlt es sich die Ergebnisse des Funktionsaufruf mit consolewrite in der Sciteconsole auszugeben. So kannst du dann live sehen sobald deine Maus sich in Bereich 1 oder 2 bewegt. Funktioniert das zuverlässig kannst du weitermachen und die anderen Funktionen implementieren und testen.

  • Makro starten

    • misterspeed
    • 20. November 2017 um 22:00

    Ob das richtig ist sagt dir zum einen die Syntax Prüfung in Scite, zum anderen könntest du die Funktion _arrayDisplay()verwenden um dein Array visuell darzustellen und zu prüfen ob es so aufgebaut ist wie du gerne hättest. Für die Funktion _arrayDisplay() wird das #include array.au3 benötigt.

    Kurzes Beispiel bzgl. Array Deklaration:

    AutoIt
    #include <array.au3>
    
    Global $aActionAreas[2][4] = [[957, 1132, 305, 349],[757, 832, 305, 349]]
    _ArrayDisplay($aActionAreas)
    
    Global $aActionAreas[3][5] = [["Actionsnummer/Makronummer","xStart","xEnd","yStart","yEnd"],[1,957, 1132, 305, 349],[2,757, 832, 305, 349]]
    _ArrayDisplay($aActionAreas)
    
    ; oder etwas übersichtlicher im Quellcode dargestellt:
    
    Global $aActionAreas[3][5] = [    ["Actionsnummer/Makronummer","xStart","xEnd","yStart","yEnd"], _
                                    [1, 957, 1132, 305, 349], _
                                    [2, 757, 832,  305, 349] _
                                ]
    _ArrayDisplay($aActionAreas)
    Alles anzeigen

    Vorteil der Überschriften im Array und der übersichtlicheren Quellcode Darstellung ist es, dass du auch nach Jahren noch schnell einen leichten Überblick darüber hast wozu das Array da war und was du darin speicherst. Verzichtet man auf eine klare Doku im Quelltext wird es sehr schwer später noch nachzuvollziehen was dort wie, warum und in welcher Reihenfolge gespeichert wurde. Das Array ist so auch leichter erweiterbar, wenn du später vielleicht noch 2 andere Bereiche hinzufügen möchtest.

    Umfassendes Array Tutorial von Bugfix: http://www.bug-fix.info/array_tut.htm

  • Makro starten

    • misterspeed
    • 20. November 2017 um 21:15
    Zitat von Vitaq

    Wie kannst du sowas behaupten du kennst mich gar nicht

    Nein ich kenn dich nicht. Es kam aber so rüber als ob du schlichtweg keine Lust hast dich tiefer mit Autoit oder Programmieren im Allgemeinen auseinander zusetzen wenn du schon nach so kurzer Zeit aufgibst. Das ist wie gesagt auch in Ordnung und allein deine Entscheidung. Jeder muss für sich abwägen ob Kosten und Nutzen im Einklang stehen. Ich verwerfe auch immer mal wieder ein Vorhaben, weil sich die Zeit die ich investieren müsste einfach nicht rentiert.

    Eine Programmiersprache lernt man aber jedenfalls nicht vom Code Schnippsel "zusammensuchen" aka copy&paste und auch nicht in 5 Minuten.

    Wenn du ernsthaftes Interesse hast etwas zu lernen orientier dich an meinem recht ausführlichen Grundgerüst, versuche das zumindestens ansatzweise umzusetzen und stell dann konkrete Fragen zu den Dingen die dir nicht klar sind z.B. "Was ist ein Array?", "Wie definiere ich ein 2D Array und wie arbeite ich damit?" meinetwegen auch "Was ist eine Funktion?", "Wie erstelle ich meine eigene Funktion?" usw. je nach Kenntnisstand eben.

    Auf die meisten Fragen wirst du dann in der Regel Verweise auf weiterführende Tutorials, Beispiele oder die Autoit Hilfedatei erhalten, denn dadurch lernst du eher was als durch Kopieren von fertigen Lösungen. Anstatt einer theoretischen und ausführlichen Beschreibung wie dein Programm aufgebaut sein sollte / könnte hätte ich in nur minimal weniger Zeit auch ein fertiges und lauffähiges Script schreiben können, nur hättest du es vermutlich nicht verstanden und beim nächsten "Projekt" wieder nicht gewusst wie man ein Programm am besten plant und strukturiert umsetzt.

    So mehr gibts von meiner Seite hier nicht zu sagen, außer dich packt doch noch der Ehrgeiz das ganze umzusetzen, dann bin ich gerne dabei behilflich deine Fragen zu klären und ggf. Fehler zu beheben. ;)

  • Verständnisfrage - RAMVerbrauch

    • misterspeed
    • 20. November 2017 um 18:08

    Mal davon ab, dass dein Script bzw. das Thema des Scriptes anscheinend gegen die Forenregeln verstößt, wenn du befürchtest, dass der Thread geschlossen wird trotzdem noch eine sachliche Anmerkung:

    Viele SQL Einzelqueries sind meist nicht nur deutlich langsamer als ein großes Query, sondern können evtl. auch wie hier zu unnötigem RAM Verbrauch führen.

    Schau dir mal das Statement "START TRANSACTION" an. Das bietet dir die Möglichkeit mehrere Statements in einem großen Statement String zusammenzufassen und als ein einziges Query an die Datenbank zu senden. Letztlich kommt das aber auf dein Script an ob die Daten bereits am Anfang alle vorliegen oder erst im Laufe der 2 Stunden nach und nach ermittelt werden und eher nicht zusammengefasst abgeschickt werden können.

  • Makro starten

    • misterspeed
    • 19. November 2017 um 21:05
    Zitat von Vitaq

    Ich werde das ganze wegen Erfolglosigkeit einstellen.

    Wohl eher wegen mangelndem Ehrgeiz und Interesse etwas dazu zu lernen. Aber is natürlich deine Entscheidung. 8o

  • Makro starten

    • misterspeed
    • 19. November 2017 um 18:25

    Ich würde dir mal zu etwas mehr Struktur raten, dann wird das ganze viel klarer und übersichtlicher.

    Vorgehensweise:

    1. Überlegen was dein Script überhaupt tun muss

    - Permanent prüfen wo die Maus ist

    - Prüfen ob die aktuelle Mausposition innerhalb deiner beiden Bereiche ist

    - Je nach Mausposition drei Aktionen ausführen: Nix | TXT -> Excel -> Makro 1 | TXT -> Excel -> Makro 2

    2. Funktionen schreiben, die die Einzelaufgaben erledigen, bzw. Überlegen was man in Funktionen auslagern kann

    - Funktion mousePosAction($aActionAreas), welche dir als Ergebnis zurückgibt welche Aktion auszuführen ist, sprich ob die Maus innerhalb Bereich 1 / 2 oder außerhalb der Bereiche ist. Das Array $aActionAreas beinhaltet alle von dir definierten Bereiche und zugehörige Aktionsnummer. (siehe Tabelle)

    Aktionsnummer xStart xEnd yStart yEnd
    1 957 1132 305 349
    2 757 832 305 349

    Als Rückgabe erhältst du von deiner Funktion entweder 0 für NIX oder eben 1/2 für das betreffende Makro, welches du danach ausführen willst.

    - Funktion openTXT($filepath) welche die TXT in Excel öffnet

    - Funktion executeExcelMakro($iActionNumber) welche Makro 1 oder 2 in Excel ausführt, wobei $iActionNumber bestimmt welches Macro ausgeführt wird und dem Rückgabewert der Funktion mousePosAction() entspricht.

    3. Das ganze in ein Script verpacken und deine Funktion mousePosAction() in Intervallen aufrufen

    4. Fehlverhalten prüfen und beseitigen

    - Deine Funktion executeExcelMakro() könnte z.B. mehrfach ausgeführt werden wenn die Maus zu lange innerhalb der Aktionsbereiche verbleibt. Das kannst du z.B. verhindern wenn du die Maus mit mouseSetPos() weg bewegst oder mit Timern und Sperrvariablen arbeitest.


    PS: Ich vermute mal, dass die Excel UDF Makros auch direkt ansteuern kann und das Senden von Tastenkombinationen unnötig ist. Vielleicht kann jemand mit mehr Kenntnissen zur Excel UDF dazu was sagen.

  • Sudoku Random Generator

    • misterspeed
    • 18. November 2017 um 15:16

    Na schau dir halt die Werte in der Scite Konsole an. Du kannst durch die Ausgaben bei jedem Funktionsaufruf sehen welchen Wert die verwendeten Variablen haben. In deinem Fall ist wie gesagt die Variable $except dafür verantwortlich, dass deine Schleife niemals verlassen wird. der Fehler entsteht also irgendwo anderst, dort wo du den "Except-String" zusammenbaust und an eRandom übergibst. Der String darf jedenfalls maximal 8 verschiedene Zahlen und niemals alle 9 enthalten. Wenn du die Ausgabe anschaust wird dir außerdem auffallen, dass der String teilweise Zahlen doppelt enthält. Warum und wieso das so ist musst du nun rausfinden.

  • Sudoku Random Generator

    • misterspeed
    • 18. November 2017 um 14:52

    Nachtrag... hab das mal erweitert oben. Der Fehler tritt scheinbar immer dann auf, wenn die Variable $except alle Zahlen von 1 bis 9 enthält. Macht ja auch Sinn, denn eine der 9 Zahlen muss definitiv eingetragen werden, wenn alle Zahlen ignoriert werden und nicht erlaubt sind wird er nie eine gültige Zahl finden.

  • Sudoku Random Generator

    • misterspeed
    • 18. November 2017 um 14:39

    Naja wie wärs mit Debuging? Hab zwar keine Lust genauer zu prüfen was schief läuft, aber mit einfachen consolewrites kann man das Problem zum einen wie von dir vermutet auf die Funktion eRandom einschränken und zum anderen auf die dort enthaltene if Bedingung, welche verhindert, dass die umschließende do...until Schleife verlassen wird. Hier mal ein Script, das nach 200 Schleifendurchläufen abbricht und dir ein paar Details in der Konsole ausgibt:

    Debug Code
    AutoIt
    #include <StaticConstants.au3>
    ;#include <Random.au3>
    
    Dim $Labels[10][10]
    $X=12
    $Y=12
    
    HotKeySet("{ESC}","e")
    
    Func e()
        Exit
    EndFunc
    
    GUICreate("SuDoKu",400,400)
    GUICtrlCreateLabel("",10,10,380,380)
    GUICtrlSetBkColor(-1,0xABABAB)
    GUICtrlCreateLabel("",136,12,2,376)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",388,10,2,380)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",12,388,376,2)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",12,10,376,2)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",10,10,2,380)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",262,12,2,376)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",12,136,376,2)
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",12,262,376,2)
    GUICtrlSetBkColor(-1,0x000000)
    
    
    For $a=1 To 9 ;runter
        For $0=1 To 9 ;rechts
            $Labels[$a][$0] = GUICtrlCreateLabel("",$X,$Y,40,40,Bitor($SS_CENTER,$SS_CENTERIMAGE))
            GUICtrlSetFont(-1,15)
            $X+=42
        Next
        $Y+=42
        $X=12
    Next
    
    GUISetState()
    
    $T=Random(1,9,1)
    
    For $0=1 to 9
        GUICtrlSetData($Labels[1][$0],StringRight($T,1))
        If $0=9 Then ExitLoop
        $T&=ERandom(1,9,$T)
    Next
    
    $T=""
    
    Sleep(1000)
    
    For $a=2 To 9
        For $0=1 To 9
            If $a>0 And $a<4 And $0>0 And $0<4 Then
                $KL=1
            ElseIf $a>0 And $a<4 And $0>3 And $0<7 Then
                $KL=2
            ElseIf $a>0 And $a<4 And $0>6 And $0<10 Then
                $KL=3
            ElseIf $a>3 And $a<7 And $0>0 And $0<4 Then
                $KL=4
            ElseIf $a>3 And $a<7 And $0>3 And $0<7 Then
                $KL=5
            ElseIf $a>3 And $a<7 And $0>6 And $0<10 Then
                $KL=6
            ElseIf $a>6 And $a<10 And $0>0 And $0<4 Then
                $KL=7
            ElseIf $a>6 And $a<10 And $0>3 And $0<7 Then
                $KL=8
            ElseIf $a>6 And $a<10 And $0>6 And $0<10 Then
                $KL=9
            EndIf
            GUICtrlSetData($Labels[$a][$0],ERandom(1,9,Read($KL,$0,$a)))
        Next
    Next
    
    Func ERandom($min,$max,$except)
    ConsoleWrite("erandom" & @CRLF)
    $count = 0
        $ZZ=StringSplit($except,"")
    ConsoleWrite("erandom: $except=" & $except & @CRLF)
    ConsoleWrite("erandom: zz[0]=" & $ZZ[0] & @CRLF)
        Do
            $W=True
            $R=Random($min,$max,1)
            For $i=1 To $ZZ[0]
                If $R=$ZZ[$i] Then
                    if $count > 100 then ConsoleWrite("erandom: if zweig ( " & $R & " = " & $ZZ[$i] & " )" & @CRLF)
                    $W=False
                    $count += 1
                    If $count > 200 Then
                        MsgBox(0,"endlessloop","endless in da loop?")
                        Exit
                    EndIf
                    ExitLoop
                EndIf
            Next
        Until $W= True
    
    Return $R
    EndFunc
    
    Func Read($K,$V,$H)
    ConsoleWrite("read" & @CRLF)
        $B=""
        $T=""
        $B&=StringStripWS(Kastchen($K),8)
        $B&=StringStripWS(Ver($V),8)
        $B&=StringStripWS(Hor($H),8)
    
    Return $B
    EndFunc
    
    
    Func Kastchen($K)
    ConsoleWrite("kastchen" & @CRLF)
        $T=""
    
        If $K=1 Then
            For $a=1 To 3
                For $0 =1 To 3
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=2 Then
            For $a=1 To 3
                For $0 =3 To 6
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=3 Then
            For $a=1 To 3
                For $0 =6 To 9
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=4 Then
            For $a=3 To 6
                For $0 =1 To 3
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=5 Then
            For $a=3 To 6
                For $0 =3 To 6
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=6 Then
            For $a=3 To 6
                For $0 =6 To 9
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=7 Then
            For $a=6 To 9
                For $0 =1 To 3
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=8 Then
            For $a=6 To 9
                For $0 =3 To 6
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        ElseIf $K=9 Then
            For $a=6 To 9
                For $0 =6 To 9
                    $T&=GUICtrlRead($Labels[$a][$0])
                Next
            Next
        EndIf
    
    Return $T
    EndFunc
    
    Func Ver($V)
    ConsoleWrite("ver" & @CRLF)
        $T=""
    
        For $a=1 To 9
            $T&=GUICtrlRead($Labels[$a][$V])
        Next
    
    Return $T
    EndFunc
    
    Func Hor($H)
    ConsoleWrite("hor" & @CRLF)
        $T=""
    
        For $0=1 To 9
            $T&=GUICtrlRead($Labels[$H][$0])
        Next
    
    Return $T
    EndFunc
    Alles anzeigen
  • Makro starten

    • misterspeed
    • 18. November 2017 um 13:35

    Was für Makros? Und vorallem wo ist dein derzeitiges Script? Wo soll die Schwierigkeit liegen in einem anderen Bereich ein anderes "Makro" auszuführen? Hast doch bereits alles implementiert und musst den Code mehr oder weniger nur noch kopieren und Werte technisch anpassen. Ohne Quellcode wird dir hier jedenfalls keiner helfen können, da wir keine Ahnung haben wie du das im Detail realisiert hast.

  • FileInstall Funktion funktioniert nicht (immer) auf Windows 7 32 Bit?

    • misterspeed
    • 16. November 2017 um 14:19

    Ich würde wie hier schon vorgeschlagen wurde komplett auf Fileinstall verzichten und alle Setupdateien oder was auch immer du auf den Zielsystemen entpacken willst über Netzlaufwerke bereitstellen.

    Das hat extrem viele Vorteile:

    - Ein zentraler Speicherort für 32/64bit spezifische Daten

    - Unter Microsoft Serverbetriebssystemen evtl. sogar ein aktives Monitoring über Zugriffe und Veränderungen des Verzeichnisses (siehe Sicherheitsbedenken)

    - Einfache Erweiterung oder Erneuerung der Datendateien z.B. neue Programmversionen (sofern du Setups ausrollst)

    - Kein permanentes Neukompilieren deines Scriptes bei Änderungen der Datendateien

    Sicherheitsbedenken gibt es eigentlich keine, sofern du für den genutzten Netzwerkpfad lediglich einen Account mit Leserechten im Script hinterlegst. Warum sollte jemand unbefugtes unbemerkt die Datendateien ändern können? Irgendwo liegen ja auch deine kompilierten Scripte, welche letztlich auf den Clients landen... ein Angreifer könnte genausogut das komplette Script durch sein eigenes ersetzen.

    Aber grundsätzlich wäre es schon interessant zu wissen warum Fileinstall auf 32bit Systemen ein anderes Verhalten als auf 64bit Systemen zeigt. Ich könnte mir vorstellen, dass hier RAM Limitierung das Problem verursachen. Unter 32bit Systemen ist der maximale Speicher einer Anwendung auf 2GB beschränkt. Vermutlich haben die Clients auch eher weniger Speicher als die 64bit Clients, grundlos setzt man ja wohl heutzutage kein 32bit Windows mehr ein. Kannst ja mal prüfen ob es bei gleichen RAM Bedingungen auch unter 64bit zum Fehler kommt und allgemein mal per Taskmanager prüfen wie der RAM Verbrauch des Scriptes kurz nach der Ausführung ausschaut.

  • Intel RST, Raid Status Abfrage

    • misterspeed
    • 14. November 2017 um 22:18
    Zitat von Darktower

    Edit: 14.11

    Hab es nun auch mal mit einem vbs probiert, das hat leider auch nichts gebracht.

    Wie kann es sein das man in dem Fenster absolut nichts automatisieren kann?

    Von der Aufmachung her würde ich vermuten, dass es sich eigentlich um ein eingebettetes Internet Explorer Objekt handelt. Jedenfalls handelt es sich nicht um eine Standard GUI mit Standard Windows Controls. Spielt aber auch keine Rolle, denn GUI Automatisierung funktioniert ohnehin nur wenn es diese gibt. Solange kein Benutzer lokal angemeldet ist existiert auch keine grafische Windows Oberfläche. Das sollte der Normalfall bei einem Server sein.

    Warum die Testmail vom Intel RST nicht versendet wird ist mir nicht ganz klar. Bekomm ich hier leider auch nicht hin, mein Minimalserver empfängt absolut nichts, selbst wenn man direkt nach dem Verbindungsaufbau noch andere Statuscodes wie 250 zurück schickt. Die Client-Serververbindung scheint jedenfalls zu bestehen, denn bei ungültigen Serveradressen erscheint sofort eine Fehlermeldung des Intel RST, der Client scheint also auf irgendwas vom Server zu warten.

    Nunja es ist ohnehin ziemlich peinlich für Intel, dass beim Emaildienst weder Authentifizierung noch Verschlüsselung vorgesehen wurde, andernfalls könnte man jeden beliebigen Emailanbieter nutzen.

  • Intel RST, Raid Status Abfrage

    • misterspeed
    • 12. November 2017 um 18:52

    Einen eigenen SMTP Server programmieren ist recht einfach.

    Info Link: https://de.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol

    Anleitung:

    - Client kompilieren

    - Server in Scite starten

    - Client.exe ausführen

    - Die Scite console sollte alle empfangenen Nachrichten des Clients anzeigen

    - Server kann mit ESC Taste sauber beendet werden

    Anmerkungen:

    Statt des Test clients kann/sollte dann natürlich Intel RST den Emailversand übernehmen. Die Emails kannst du dann im Serverscript analysieren und auswerten.

    Abweichend vom Wikipedia Artikel sendet die Autoit Funktion "_INetSmtpMail()" im Übrigen kein "QUIT", sondern einen "." nach Ende der Emailübertragung. Ob dies bei anderen Emailclients ebenfalls so ist oder ob es noch weitere Statusnachrichten gibt weiß ich nicht. In der Serverconsole sollte aber ersichtlich sein ab wann das Script nicht mehr korrekt funktioniert bzw. auf was dein Server evtl. falsch antwortet.

    Statt CRLF könnte der Email Client auch nur ein LF senden, in diesem Fall endet mein Switch...Case immer im ELSE Zweig (250 OK). Sollte dies bei anderen Clients vorkommen muss der Switch...Case erweitert werden.

    Sollten nachfolgende Scripte nicht funktionieren bitte prüfen ob Virenschutz oder Firewall die Scripte am Mailversandt hindern und ggf. Ausnahmeregeln erstellen.


    Test SMTP Server:

    Code
    #include <array.au3>
    
    HotKeySet("{ESC}", "myexit")
    ;OnAutoItExitRegister("myexit")
    
    Global $g_IP = "127.0.0.1"
    Global $aConnections[1]=["Socketliste"]
    
    TCPStartUp()
    
    $MainSocket = TCPListen($g_IP, 25,  100 )
    If $MainSocket = -1 Then Exit MsgBox("","Autoit SMTP Server Error","creating main socket failed")
    
    While 1
    
        $ConnectedSocket = TCPAccept( $MainSocket)
    
        If $ConnectedSocket >= 0 Then
            _ArrayAdd($aConnections,$ConnectedSocket)
            TCPSend($ConnectedSocket,"220 service ready")
            ConsoleWrite("Serveranswer: 220 service ready" & @CRLF )
        EndIf
    
        If UBound($aConnections) > 1 Then
            For $i = 1 to UBound($aConnections)-1
                $sRecv = TCPRecv($aConnections[$i],1024*200)
                if StringLen($sRecv)>=1 Then
                    ConsoleWrite("--- new email message---" & @CRLF & "Socket: " & $aConnections[$i] & @CRLF & @CRLF & '"' & $sRecv & '"' & @CRLF & @CRLF & "--- end email message ---" & @CRLF & @CRLF)
                    $sRecv=StringStripWS(StringReplace(StringStripCR($sRecv),@LF,""),8)
                    Switch $sRecv
                        Case "DATA"
                            TCPSend($aConnections[$i],"354 start mail input")
                            ConsoleWrite("Serveranswer: 354 start mail input" & @CRLF )
                        Case "QUIT","."
                            TCPSend($aConnections[$i],"221 closing channel")
                            ConsoleWrite("Serveranswer: 221 closing channel" & @CRLF )
                            TCPCloseSocket($aConnections[$i])
                            _ArrayDelete($aConnections,$i)
                            ExitLoop
                        Case Else
                            TCPSend($aConnections[$i],"250 OK")
                            ConsoleWrite("Serveranswer: 250 OK" & @CRLF )
                    EndSwitch
                EndIf
            Next
        EndIf
    
    Wend
    
    Func myexit()
        If UBound($aConnections) > 1 Then
            For $i = 1 to UBound($aConnections)-1
                TCPCloseSocket($aConnections[$i])
            Next
        EndIf
        TCPCloseSocket($MainSocket)
        TCPShutdown()
        MsgBox("","Autoit SMTP Server Shutdown","Alle Sockets geschlossen")
        Exit
    EndFunc
    Alles anzeigen

    Test Client:

    Code
    #include <INet.au3>
    
    $s_SmtpServer = "127.0.0.1"
    $s_FromName = "autoit smtp server test mailer"
    $s_FromAddress = "MyDirtyFantasies@PervMail.de"
    $s_ToAddress = "SomeoneWhoExistsOnlyInMyDreams@SexyGirl.de"
    $s_Subject = "Dirty Mail"
    Dim $as_Body[2]
    $as_Body[0] = "Zeile 1 meiner versauten Email"
    $as_Body[1] = "Zeile 2 und zugleich auch das Ende dieser Email"
    $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
        MsgBox(0, "Success!", "Mail sent")
    Else
        MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™