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. Xenon

Beiträge von Xenon

  • Rätzelecke No. 001

    • Xenon
    • 25. März 2022 um 12:57
    Zitat von BugFix

    Habs jetzt nicht ausprobiert, vermute aber, dass das einer dieser Jahrmarktstricks ist.

    Ganz genau! :Glaskugel: Hier für alle Neugierigen mal meine Lösung:

    Spoiler anzeigen

    Wir nennen die drei Zahlen a, b, c.

    Laut Text ergibt sich die Formel:

    e = ((a * 40 * 25 + b) * 50 + 1) * 400 + 2 * c

    // Yjuq Ich glaube du hast in deiner Formel am Ende einmal + mit * vertauscht ;)

    Umgeformt ergibt das:

    e = 20000000 * a + 20000 * b + 2 * c + 400

    Um uns das ein bisschen besser vorstellen zu können, klammern wir noch Faktor 2 aus:

    e = 2 * (10000000 * a + 10000 * b + c + 200)

    Und noch ein paar Terme auf die andere Seite gebracht:

    e / 2 - 200 = 10000000 * a + 10000 * b + c

    Spannend ist jetzt die rechte Seite. Die Faktoren vor a und b sind glatte Zehnerpotenzen und verschieben diese Zahlen dementsprechend nur "nach links". Wie wir wissen, sind a und b dreistellig und c vierstellig. Schematisch ergibt sich bei der Addition auf der rechten Seite der Gleichung also:

    Code
    aaa0000000
    +  bbb0000
    +     cccc
    ----------
    aaabbbcccc

    Wie man sieht, sind a, b und c lediglich in Dezimaldarstellung hintereinandergeschrieben. Jetzt wird auch klar, wie wir ganz einfach a, b und c bestimmen können: Wir zerlegen diese Zahl einfach wieder! (z.B. per StringMid)

    Dementsprechend ergibt sich folgendes kurzes Lösungsskript:

    AutoIt
    $e = 2469136180
    
    ConsoleWrite("Ausgangszahl: e = " & $e & @CRLF)
    
    $d = $e / 2 - 200
    $a = StringMid($d, 1, 3)
    $b = StringMid($d, 4, 3)
    $c = StringMid($d, 7, 4)
    
    ConsoleWrite("Ergebnis: (a, b, c) = (" & $a & ", " & $b & ", " & $c & ")" & @CRLF)
  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Xenon
    • 23. Oktober 2021 um 21:54
    Zitat von Bitnugger

    So geht es auch: [...]

    Wenn wir hier schon ins Detail gehen, macht meiner Meinung nach eine Standard-If-Abfrage den Code deutlich übersichtlicher als irgendwelche "Switch True"-Konstruktionen:

    AutoIt
    While 1
        $nMsg = GUIGetMsg()
    
        If $nMsg = $GUI_EVENT_CLOSE Or $sAusweisNr <> "" Then
                _WinAPI_UnhookWindowsHookEx($hKeyHook)
                DllCallbackFree($hKeyProc)
                GUIDelete($hGui)
                Exitloop
        EndIf
    WEnd
  • OutlookEX UDF besprechung mit mehreren leuten

    • Xenon
    • 26. Juli 2021 um 10:44
    Zitat von tommii

    ps: Verrätst du mir noch, wie ich daraus ein ganztägiges ereigniss mache? Ich habe das schon gelesen, finde es aber nicht wieder...

    Hi,

    wie in folgendem Beitrag gezeigt, brauchst du dafür noch den Parameter "AllDayEvent=1" beim Aufruf von _OL_ItemCreate.

  • Was ist die Taste Break?

    • Xenon
    • 13. Juli 2021 um 09:38

    Auf deutschen Tastaturen ist die Taste üblicherweise mit "Pause" beschriftet, siehe: https://de.wikipedia.org/wiki/Pause_(Tastatur)

  • RegEx verstehen: Wieso matcht "a|b|c" auf "abc"

    • Xenon
    • 24. März 2021 um 01:02

    Hi,

    ich verstehe deine Interpretation und warum das aus deiner Sicht unlogisch erscheint. Allerdings haben reguläre Ausdrücke verschiedene Anwendungsfälle. Im Gegensatz zu deinem Beispiel möchte man häufig eben nicht nur prüfen, ob ein gesamter String einem Muster entspricht (Ja-Nein-Entscheidung), sondern aus einem String unbekannte Teile herausfiltern / suchen.

    Kurzes Beispiel:

    Aus "Wir treffen uns morgen um 13:35 Uhr am Bahnhof." soll die Uhrzeit herausgefiltert werden. Dann ergibt es natürlich Sinn, dass mein Pattern nur den wesentlichen Teil beinhalten muss, nämlich (ganz vereinfacht) "\d{2}:\d{2}". Alles andere würde hier zu Unleserlichkeit führen. Damit hast du genau dein gewünschtes Verhalten:

    Zitat von f705185@rppkn.com

    Nach meinem Verständnis von RegEx sollte man explizit angeben, was man matcht und nicht, was man nicht matcht.

    Besonders bei den Flags 1-4 ergibt diese Substring-Suche deutlich mehr Sinn. Und wie du auch selbst bemerkt hast, ist deine gewünschte Funktionalität ebenfalls umsetzbar, man muss halt nur String-Anfang und -Ende explizit angeben:

    Zitat von f705185@rppkn.com

    Immerhin geht "\A(a|b|c)\Z". Ist zwar hässlich und wird mich irgendwann zwingen \A und \Z nachzuschlagen, wenn ich den Code überarbeite, aber scheinbar muss das in Autoit dann so. Danke.

    Kleine Off-Topic-Anmerkung dazu: Dieses "hässliche" Verhalten ist nicht nur AutoIt-spezifisch, das hat sich unter anderem auch in PHP oder Linux bewährt.

    Viele Grüße

    Xenon

  • Einfaches Setup einer HTA Datei

    • Xenon
    • 16. März 2021 um 11:27

    Hallo,

    dein erwünschtes Vorgehen sollte mit folgenden AutoIt-Funktionen in wenigen Zeilen umzusetzen sein:

    1a) Datei installieren (in der AutoIt-EXE eingebunden)

    FileInstall

    1b) Alternativ nur die Datei kopieren, falls du das möchtest:

    FileCopy

    2) Shortcut erstellen:

    FileCreateShortcut

    Auf der jeweiligen Hilfeseite findest du neben der Erklärung unten auch immer ein Beispiel, wie der Befehl genutzt werden kann.

    Viele Grüße

    Xenon

  • Office-Installation mit Fortschrittsbalken, der den Prozentsatz anzeigt

    • Xenon
    • 26. Februar 2021 um 20:10

    Hi hanady,

    So if I understand you correctly, you would like to install (any?) program silently in the background and have an AutoIt GUI showing the progress during installation?

    I don't want to be pessimistic but this seems pretty close to impossible. How is the AutoIt script supposed to figure out the current progress status? Only the installer script knows what it's doing internally. This approach might be possible for a specific installer - but only if the installer provides this information to the calling AutoIt script.

    Btw: Do you really need a progress bar? Usually, progress bars only provide a rough estimation anyway. (All of us encountered Windows updates getting stuck at 99%...)

    If you definitely need the progress bar, couldn't you just execute the GUI installer of the program and not implement this functionality yourself?

    This might be a better approach to your overall problem. Could you elaborate further on what you are trying to achieve?

  • Verhindern, dass Fenster Größe ändert bei Ziehen an Bildschirmrand

    • Xenon
    • 6. November 2020 um 17:27

    Noch eine kleine Anmerkung am Rande:
    Wenn du manuell die entsprechenden Mouse-Events abfängst, solltest du evtl. beachten, dass man den gleichen Effekt mit den Tastenkombinationen Win+Pfeiltaste ebenfalls erreicht. Ein reines Abfragen von Mouse-Events könnte also je nach genauer Zielstellung nicht ausreichen.

  • kompiliertes Autoit Script mit #require Admin aber im Usercontext starten

    • Xenon
    • 13. August 2020 um 10:25

    Eine dynamische Anpassung des Sicherheitskontexts (Admin/User) ist meines Wissens nach leider nicht möglich. Dies geht nur durch Starten eines neuen Prozesses, siehe dazu auch das Codebeispiel zu _Security__CreateProcessWithToken oder die folgende Diskussion: UAC Elevate and DeElevate Scripts.

    Dementsprechend sind mindestens zwei Prozesse nötig, daher ist die Vorgehensweise von Moombas sinnvoll. Ein ganz einfaches Beispiel sähe so aus:

    AutoIt: program.au3
    ; Hauptskript im nicht-privilegierten Modus
    
    ; Hier die eigentliche Programmlogik mit Netzlaufwerkzugriff & co.
    MsgBox(64, "", "Befehl ausgeführt. IsAdmin: " & IsAdmin())
    
    ; Hier werden Admin-Rechte benötigt
    _RunAsAdmin('ACTION1')
    
    Func _RunAsAdmin($sAction)
      ShellExecute(@ScriptDir & "\admin.au3", $sAction) ; für nicht kompilierte Skripte - sonst hier entsprechend anpassen
    EndFunc
    Alles anzeigen
    AutoIt: admin.au3
    #RequireAdmin
    
    ; Dieses Skript führt nur Admin-Aktionen aus
    
    ; Wir bekommen die gewünschte Aktion als Kommandozeilenparameter
    If $CmdLine[0] <> 1 Then Exit
    
    Switch $CmdLine[1]
        Case "ACTION1"
            _Action1()
        Case "ACTION2"
            _Action2()
    EndSwitch
    
    Func _Action1()
        MsgBox(64, "", "Aktion 1 aufgerufen. IsAdmin: " & IsAdmin())
    EndFunc
    
    Func _Action2()
        MsgBox(64, "", "Aktion 2 aufgerufen. IsAdmin: " & IsAdmin())
    EndFunc
    Alles anzeigen

    Der Nachteil dieser Methode ist, dass für jede Admin-Aktion die UAC-Abfrage erneut angezeigt wird, da ein neuer Prozess gestartet wird. Das kann ganz schön nervig werden.

    Je nach deinem konkreten Anwendungsfall kann es daher mehr Sinn ergeben, auf eines von meinen oben verlinkten Beispielen zurückzugreifen. Alternativ könnte man auch das Admin-Skript nur einmal starten und dann über Interprozesskommunikation die auszuführenden Aktionen übermitteln.

  • HotKeySet("{BREAK}", "Terminate") funktioniert nicht

    • Xenon
    • 2. Juli 2020 um 22:25

    Hallo HansJ54,

    folgendes Beispiel geht bei mir:

    AutoIt
    HotKeySet("{PAUSE}", _Pause) ; funktioniert
    HotKeySet("^{BREAK}", _Terminate)   ; funktioniert
    While 1    
        Sleep (1000)
    WEnd
    
    Func _Terminate()    
        MsgBox(0, "Test", "Ctrl+Pause")
    EndFunc
    
    Func _Pause()    
        MsgBox(0, "Test", "Pause")
    EndFunc
    Alles anzeigen

    ABER: Nur, wenn die Anwendung NICHT aus SciTE heraus ausgeführt wird (per F5). Das liegt sicher daran, dass SciTE diesen HotKey selbst für das Beenden des Skripts reserviert.

  • InputBox() nach vorne bringen

    • Xenon
    • 21. Mai 2020 um 23:44

    alpines Das ist ein guter Hinweis!

    Natürlich könnte man dann stattdessen auch gleich eine eigene temporäre GUI nehmen, dann hat das ganze gar keine Seiteneffekte:

    AutoIt
    $sText = _InputBoxOnTop("Test", "Bitte etwas eingeben", "Standardtext")
    If @error Then
        MsgBox (0, "", "Es wurde kein Text eingegeben!")
    Else
        MsgBox (0, "", "Du hast folgenden Text eingegeben: " & $sText)
    EndIf
    
    
    ; Diese Funktion erzeugt eine InputBox, die immer im Vordergrund ist
    Func _InputBoxOnTop($sTitle, $sPrompt, $sDefault = "", $sPasswordChar = "", $iWidth = -1, $iHeight = -1, $iLeft = Default, $iTop = Default, $iTimeout = 0)
        Local $hGUI = GUICreate("", 0, 0, 0, 0, -1, 8)
        Local $sReturn = InputBox($sTitle, $sPrompt, $sDefault, $sPasswordChar, $iWidth, $iHeight, $iLeft, $iTop, $iTimeout, $hGUI)
        Local $iError = @error
        GUIDelete($hGUI)
        Return SetError($iError, 0, $sReturn)
    EndFunc
    Alles anzeigen

    Allerdings könnte man spätestens dann auch überlegen, ob man nicht in die ohnehin erstellte GUI einfach noch ein Inputfeld einfügt, und den Aufruf von InputBox komplett weglässt. ;)

  • InputBox() nach vorne bringen

    • Xenon
    • 21. Mai 2020 um 23:30

    Hallo HansJ54,

    du hast recht: Die InputBox hat keinen Parameter, um sie immer im Vordergrund anzuzeigen.

    Wie man das ganze dennoch realisieren kann, ist hier ganz gut beschrieben: https://www.autoitscript.com/forum/topic/13…n-top-inputbox/

    (Übrigens erstes Google-Ergebnis zu "autoit inputbox foreground".)

    Wenn man einen der Vorschläge von guinness noch in eine hübsche Funktion auslagert, kann sowas dabei rauskommen:

    AutoIt
    $sText = _InputBoxOnTop("Test", "Bitte etwas eingeben", "Standardtext")
    If @error Then
        MsgBox (0, "", "Es wurde kein Text eingegeben!")
    Else
        MsgBox (0, "", "Du hast folgenden Text eingegeben: " & $sText)
    EndIf
    
    
    ; Diese Funktion erzeugt eine InputBox, die immer im Vordergrund ist
    Func _InputBoxOnTop($sTitle, $sPrompt, $sDefault = "", $sPasswordChar = "", $iWidth = -1, $iHeight = -1, $iLeft = Default, $iTop = Default, $iTimeout = 0)
        WinSetOnTop(AutoItWinGetTitle(), "", 1)
        Local $sReturn = InputBox($sTitle, $sPrompt, $sDefault, $sPasswordChar, $iWidth, $iHeight, $iLeft, $iTop, $iTimeout, WinGetHandle(AutoItWinGetTitle()))
        SetError(@error)
        Return $sReturn
    EndFunc
    Alles anzeigen

    Die Verwendung der Funktion _InputBoxOnTop() sollte damit genau so sein wie bei der normalen InputBox. Das zeigen auch die ersten Zeilen im Codebeispiel.

    Viele Grüße

    Xenon

  • Programmiersprache Nim

    • Xenon
    • 22. April 2020 um 17:54
    Zitat von BugFix

    Mein Daumen für ein Unterforum. :thumbup:

    Ich schließ mich meinen Vorrednern an :thumbup:

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Xenon
    • 4. April 2020 um 12:54

    Sehr interessante Sache...

    Bei mir sieht's ähnlich aus, allerdings ist die zweite Zeit im Verhältnis nochmal ein bisschen größer:

    > ------------------------------------------

    > >>>>> Check 1.1 - Calc() vor MsgBox <<<<<

    ! Elapsed time = : 672.835 ms

    > >>>>> Check 1.2 - Calc() nach MsgBox <<<<<

    ! Elapsed time = : 8955.305 ms

    > ------------------------------------------

    Wie autoiter schon meinte, tritt das Problem auch auf, wenn man anstatt der MsgBox z.B. Folgendes ausführt:

    AutoIt
    GUICreate("Test")
    GUISetState()
    GUIDelete() ; optional

    Getestet auf: Win 10 Pro 1909 (Build 18363.720)

    Viele Grüße

    Xenon

  • Webseiten Quelltext richtig lesen ohne javascript

    • Xenon
    • 26. März 2020 um 12:57

    Gib dir mal $G_Titel[0] anstatt von $G_Titel aus. _StringBetween liefert nämlich ein Array mit Treffern zurück.

    Viele Grüße

    Xenon

  • Iteratoren - ArrayIter.au3

    • Xenon
    • 22. März 2020 um 23:53

    Hi BugFix,

    sieht schick aus! Da haben wir ein gutes Beispiel, wo es wirklich Sinn macht, Execute zu verwenden! :thumbup:

    Das Script funktioniert soweit super, mir ist allerdings noch eine Kleinigkeit aufgefallen:

    Du ersetzt in deinen Funktionen per StringReplace einfach "it" durch den entsprechenden Wert. Damit zerschießt du ungewollt Funktionsaufrufe wie diesen hier:

    AutoIt
    _ArrayKeepItIf($aN, 'BitAnd(it, 1) = 0')

    Das "it" in BitAnd wird nämlich ebenfalls ersetzt!

    Meiner Recherche nach dürfte das aber nur eine handvoll Funktionen betreffen, die wirklich Sinn machen, darunter die Bit-Funktionen und StringIsDigit.

    Natürlich gäbe es einen Workaround à la

    AutoIt
    Func BAND($a, $b)
        Return BitAND($a, $b)
    EndFunc
    _ArrayKeepItIf($aN, 'BAND(it, 1) = 0')

    Aber vielleicht fällt dir ja eine andere Lösung ein. ;)

    Das gleiche Problem hätte man logischerweise auch, wenn man eigene Funktionen aufruft, die diese Zeichenfolge enthalten.

    Viele Grüße

    Xenon

  • Problem mit Verschlüsselung zw Autoit und PHP7.2

    • Xenon
    • 13. März 2020 um 23:42

    Hi JanausSm,

    wenn du eine Anfrage an den Webserver über HTTPS sendest, dann ist sowohl die Hin- als auch die Rückrichtung verschlüsselt. Also nicht nur deine Anfrage, sondern auch die zugehörige Antwort vom Webserver (z.B. per PHP echo).

    Normalerweise sollte das für die meisten Zwecke ausreichen, wenn du nicht noch zusätzliche Anforderungen hast, von denen wir nichts wissen?

    Nochmal zum allgemeinen Verständnis: Nur weil du dir eine HTTPS-Seite im Browser anschauen kannst, heißt das nicht, dass die Antwort unverschlüsselt übertragen wurde! Stattdessen übernimmt dein Browser im Hintergrund die Ver- und Entschlüsselung (bzw. ruft entsprechende Bibliotheken auf) und zeigt dir lediglich die entschlüsselten Daten an.

    Viele Grüße

    Xenon

  • Extensa - Hotkeys für unterschiedliche Eingabegeräte trennen

    • Xenon
    • 19. Dezember 2019 um 22:50

    Hi alpines ,

    ich weiß, die letzte Antwort hier liegt schon eine Weile zurück, aber ich denke es passt trotzdem hier rein.

    Erst einmal ein herzliches Dankeschön für dieses Programm! :thumbup:8)

    Ich wollte das schon lange mal ausprobieren und habe mir nun endlich nach einigen Jahren doch noch ein zweites Numpad zugelegt. Deine Anwendung funktioniert auch immer noch zuverlässig.

    Allerdings hätte ich eine Frage:

    Weißt du, ob es eine Möglichkeit gibt, die Enter-Taste ebenfalls anders zu belegen? Das wäre ganz praktisch, aber standardmäßig scheint das mit dem Programm nicht zu gehen. Wie ich sehe, war auf deinem Numpad die Taste laut Aufklebern auch nicht umgemappt?

    Ich vermute mal, das basiert irgendwie auf dem gleichen Grund wie die Einschränkung bei der Standardfunktion HotKeySet?

    Zitat von AutoIt Help File

    The following hotkeys cannot be set:

    NumPad's Enter Key: Instead, use {Enter} which captures both Enter keys on the keyboard.

    Hat jemand eine Idee für einen Workaround?

    Falls das Verwenden der Taste leider nicht möglich ist, weiß jemand, warum diese Taste von Windows so besonders behandelt wird? Das würde mich mal interessieren.

    Viele Grüße

    Xenon

  • Problem mit MsgBox und individuellen Tasten

    • Xenon
    • 3. Dezember 2019 um 23:10
    Zitat von Kanashius

    Ich hab das ganze mal etwas robuster gegen andere Fenster gemacht, die zum gleichen Zeitpunkt auftauchen...

    Das ist natürlich noch mal besser als die bisherige Version! Allerdings würde ich mich an dieser Stelle dann doch eher autoiter anschließen und dafür plädieren, selbst eine einfache GUI zusammenzubasteln oder eine passende UDF zu nutzen. Neben Hooks & Dll-Calls zusätzlich auch noch mit zufälligen Window-Titeln & co. herumzuhantieren macht das Ganze aus meiner Sicht noch unnötig komplexer als es ohnehin schon ist. Zum anderen wäre eine eigene GUI auch deutlich flexibler. Und die erwähnte UDF von Melba sieht auch vielversprechend aus, dann muss man nicht das Rad neu erfinden:

    Zitat von autoiter

    PS: Es gibt dazu auch eine nette UDF: https://www.autoitscript.com/forum/topic/10…rsion-2-aug-18/

  • Problem mit MsgBox und individuellen Tasten

    • Xenon
    • 3. Dezember 2019 um 18:02

    Hi Bernhard,

    die Funktion _WinAPI_SetWIndowsHookEx($WH_CBT, ...) registriert deine Funktion "CbtHookProcMsgBox" als Callback.

    Der Parameter $WH_CBT bedeutet hierbei, dass diese Funktion in folgenden Fällen aufgerufen wird:

    Zitat von Microsoft

    The system calls a WH_CBT hook procedure before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; [...]

    Der Hook gilt für deine gesamte Anwendung und deshalb wird die Callback-Funktion auch aufgerufen, wenn (nach Schließen der MsgBox) die Main-GUI wieder aktiviert wird.

    Dann überschreibt _WinAPI_SetDlgItemText entsprechend (ungewollt) deine Buttontexte auf der Main-GUI.

    Um dies zu umgehen, fallen mir spontan zwei Workarounds ein:

    1. Die Texte (ja/nein/vielleicht) nur setzen, falls das aktive Fenster nicht die Main-GUI ist:

    Dazu muss einfach nur eine If-Bedingung im Programm eingefügt werden:

    Code
    If $wParam <> $hMainGUI Then
        _WinAPI_SetDlgItemText($wParam, 3, "Ja")
        _WinAPI_SetDlgItemText($wParam, 4, "Nein")
        _WinAPI_SetDlgItemText($wParam, 5, "Vielleicht")
    EndIf

    2. Den Hook nach dem Setzen der Texte in der MsgBox sofort wieder entfernen:

    Dazu muss lediglich die Zeile

    Code
    _WinAPI_UnhookWindowsHookEx($hHookMsgBox)

    an der ursprünglichen Stelle entfernt und stattdessen nach unten verschoben werden:

    Code
    ...
    _WinAPI_SetDlgItemText($wParam, 5, "Vielleicht")
    _WinAPI_UnhookWindowsHookEx($hHookMsgBox)            ; hier einfügen


    Meiner Ansicht nach dürfte Variante 2 die sauberere sein, aber die konkrete Umsetzung bleibt natürlich jedem selbst überlassen ;)

    Viele Grüße

    Xenon

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™