diff --git a/AHKL_ChangeLog.htm b/AHKL_ChangeLog.htm index 692257e6..735f1858 100644 --- a/AHKL_ChangeLog.htm +++ b/AHKL_ChangeLog.htm @@ -15,6 +15,67 @@

Änderungen und neue Features

Ältere Änderungen können in Archivierte Änderungen gefunden werden.

+

1.1.20.00 - 8. März 2015

+

Neue Features:

+

Erweitert: Hotkey-, Menu-, SetTimer-, Gui- und Gui-Steuerelement-Ereignisse akzeptieren nun eine Funktion anstelle eines Labels, wenn kein Label gefunden wird.

+

Erweitert: Hotkey-, Menu-, SetTimer-, Gui- und Gui-Steuerelement-Ereignisse akzeptieren nun ein Funktionsobjekt. Hinzugefügt: Delete-Unterbefehl für SetTimer zum Freigeben des Objekts.

+

Erweitert: Bei OnMessage() ist es nun möglich, dass eine beliebige Anzahl von Funktionen oder Funktionsobjekten eine einzelne Nachricht überwachen können.

+

Hinzugefügt: OnExit() und OnClipboardChange(), die ein Funktionsname oder -objekt akzeptieren.

+

Hinzugefügt: Hotkey-Label können nun auf eine Funktionsdefinition verweisen.

+

Hinzugefügt: U/L/T-Modifikatoren zum Umwandeln in Groß-/Kleinschreibung mit Format().

+

Hinzugefügt: E-Option für den Input-Befehl, um Endungszeichen als Zeichen statt als Tastencode zu behandeln.

+

Hinzugefügt: Unterstützung von ** (stderr) in FileAppend.

+

Hinzugefügt: ObjBindMethod(obj, method, args*) und Func.Bind(args*).

+ +

Änderungen:

+

Geändert: AHK verhält sich nun anders, wenn das Hauptscript nicht gefunden wird:

+ +

Geändert: WinActivate wird das Fenster nun wiederherstellen, wenn es bereits aktiv, aber minimiert ist.

+

Geändert: WinActivate sucht nun nach einem sichtbaren Fenster, um es zu aktivieren, wenn DetectHiddenWindows ausgeschaltet und das aktive Fenster versteckt ist, anstatt nichts zu tun.

+

Geändert: A_CaretX/A_CaretY verwenden nun eine andere Methode zum Abrufen der Position der Texteinfügemarke.

+ +

Geändert: A_OSVersion verwendet nun RtlGetVersion(), um Windows 10 und hoffentlich auch zukünftige Versionen erkennen zu können.

+

Geändert: A_OSVersion gibt nun eine Versionsnummer im Format "Haupt.Neben.Build" zurück, wenn es keinen Namen für das Betriebssystem hat.

+

Geändert: Objekte unterstützen nun x[,y], x.y[,z] und x[](y).

+ +

Einige interne Änderungen, um Fehler zu beheben, Codegröße zu reduzieren oder Performance zu verbessern, sowie:

+ + +

Fehlerbehebungen:

+

Behoben: VK-zu-Tastenname-Umwandlungen für die Tasten von 'A' bis 'Z' berücksichtigen nun das Tastaturlayout.

+ +

Behoben: FileAppend's * (stdout) berücksichtigt nun den Codierung-Parameter, anstatt immer ANSI-Text auszugeben.

+

Behoben: Auto-Skalierung von GUIs mit nur einem Scrollbalken.

+

Behoben: Exception(m, n) verursachte einen Absturz, wenn n sehr weit die Grenzen überschritten hat.

+

Behoben: GuiContextMenu setzt A_GuiEvent nun korrekt in x64.

+

Behoben: FileGetSize übergab manchmal ein unbestimmtes Ergebnis, wenn die Datei nicht existiert oder nicht geöffnet werden kann.

+

Behoben: Thread-Unterbrechungen speichern und stellen ErrorLevel besser wieder her, wodurch folgendes behoben wird:

+ +

Behoben: ControlClick-Pos-Modus ignoriert nun deaktivierte Steuerelemente.

+

Behoben: Merkwürdiges Verhalten, wenn Gui +MaxSize kleiner als +MinSize ist.

+

Behoben: GuiControl/Get benötigte einen Gui-Namen, wenn ein Steuerelement-HWND angegeben wurde.

+

Behoben: Meta-Funktionen beeinträchtigten Zeilennummern, die von Exception() gemeldet werden.

+

1.1.19.03 - 11. Februar 2015

Verbessert: Neubelegung erlaubt nun scXXX::Y, wenn das aktuelle Tastaturlayout das ScXXX nicht einem VK-Code zugeordnet hat. Allerdings muss Y noch auf dem aktuellen Tastaturlayout vorhanden sein.

Behoben: break n funktioniert nun korrekt, wenn until vorhanden ist, anstatt den Thread zu beenden.

@@ -875,7 +936,7 @@

Revision 35 - 25. Oktober 2009

Revision 34 - 24. Oktober 2009

Geändert: Das Setzen eines Wertes auf einen leeren String innerhalb eines Objekts speichert nun den leeren String, anstatt das Key-Value-Paar vom Objekt zu entfernen. _Remove kann weiterhin verwendet werden, um Key-Value-Paare vollständig zu entfernen.

-

Geändert: Befehlsnamen müssen mit einem Leerzeichen, Tabulator oder Komma terminiert werden. Die folgenden Zeichen umgehen nicht länger diese Anforderung: <>:+-*/!~&|^[]. Zum Beispiel werden Syntaxfehler wie MsgBox< foo und If!foo nun bei der Ladezeit abgefangen.

+

Geändert: Befehlsnamen müssen mit einem Leerzeichen, Tabulator oder Komma terminiert werden. Die folgenden Zeichen umgehen nicht länger diese Anforderung: <>:+-*/!~&|^[]. Zum Beispiel werden Syntaxfehler wie MsgBox< foo und If!foo nun bei der Ladezeit abgefangen.

Behoben: Return behandelt nun Ausdrücke korrekt, wodurch eine Variable ein Objekt enthalten kann. Zum Beispiel sollte Return x:=y, Return (x), Return x,... und ähnliches nun richtig funktionieren (Return x hat bereits funktioniert).

Behoben: Multi-Parameter get/set unterstützte Meta-Funktionen für mehrere Objekte nicht richtig (wie z. B. für x und x[y] im Ausdruck x[y,z]).

Behoben: Hintereinanderfolgende Objektzuweisungen wie z. B. x[y]:=z in r:=x[y]:=z ergaben keine Zahlen oder Objekte - fehlerhaft seit L33.

diff --git a/AutoHotkey.htm b/AutoHotkey.htm index ef7d0f57..a250d1d5 100644 --- a/AutoHotkey.htm +++ b/AutoHotkey.htm @@ -11,7 +11,7 @@ -

Version v1.1.19.03

+

Version v1.1.20.00

Eine deutsche Übersetzung von http://ahkscript.org/docs/ (siehe hier für mehr Details).

©2003-2014 Chris Mallett, und zum Teil ©AutoIt-Team und die AHK-Community

Software-Lizenz: GNU General Public License

diff --git a/Hotkeys.htm b/Hotkeys.htm index 93a397db..4ccf813f 100644 --- a/Hotkeys.htm +++ b/Hotkeys.htm @@ -23,6 +23,8 @@

Inhaltsverzeichnis

  • Benutzerdefinierte Kombinationen und Sonstige Features
  • Mausrad-Hotkeys
  • Tipps und Hinweise
  • +
  • Alt-Tab-Hotkeys
  • +
  • Funktions-Hotkeys
  • Einführung und einfache Beispiele

    @@ -174,6 +176,7 @@

    Mausrad-Hotkeys

    SendMessage, 0x114, 1, 0, %fcontrol%, A ; 0x114 ist WM_HSCROLL und die 1 danach SB_LINERIGHT. return

    Da Mausrad-Hotkeys nur Ereignisse beim Drücken erzeugen (nie beim Loslassen), können sie nicht als Hotkeys verwendet werden, die das Wort "UP" enthalten.

    +

    Tipps und Hinweise

    Jede Ziffernblocktaste kann dazu gebracht werden, je nach Status der NUM-Taste zwei verschiedene Hotkey-Subroutinen zu starten. Alternativ kann man eine Ziffernblocktaste auch dazu bringen, die gleiche Subroutine zu starten, unabhängig vom Status der NUM-Taste. Zum Beispiel:

    NumpadEnd::
    @@ -203,6 +206,7 @@ 

    Tipps und Hinweise

    Ein Hotkey-Label kann als Ziel von Gosub oder Goto verwendet werden. Zum Beispiel: Gosub ^!s.

    Häufig werden Hotkeys dazu verwendet, eine wiederholende Aktion zu starten und zu stoppen, wie z. B. mehrere Tastatureingaben oder Mausklicks. Ein Beispiel dazu findet man in diesem FAQ-Thema.

    Jedes Script kann aus mehreren Threads bestehen, wodurch es möglich ist, dass ein neuer Hotkey gestartet werden kann, obwohl eine vorherige Hotkey-Subroutine noch läuft. Zum Beispiel können neue Hotkeys gestartet werden, während eine MsgBox mit dem aktuellen Hotkey angezeigt wird.

    +

    Alt-Tab-Hotkeys

    Jeder Alt-Tab-Hotkey muss eine Kombination von zwei Tasten sein, das üblicherweise mit einem Und-Zeichen (&) erreicht werden kann. Im folgenden Beispiel kann man die rechte ALT-Taste gedrückt halten und J oder K drücken, um das Alt-Tab-Menü durchzuschalten:

    RAlt & j::AltTab
    @@ -232,5 +236,25 @@ 

    Alt-Tab-Hotkeys

    IfWinExist ahk_class #32771 Send {Escape}{Alt up} ; Schließt das Menü, ohne das ausgewählte Fenster zu aktivieren. return
    + +

    Funktions-Hotkeys [v1.1.20+]

    +

    Es ist möglich, einem oder mehreren Hotkeys eine Funktion zuzuweisen, indem man sie wie folgt einfach direkt unter dem Hotkey-Label definiert:

    +
    ; STRG+UMSCHALT+O, um den enthaltenen Ordner im Explorer zu öffnen.
    +; STRG+UMSCHALT+E, um den Ordner zu öffnen und darin die aktuelle Datei zu markieren.
    +; Unterstützt SciTE und Notepad++.
    +^+o::
    +^+e::
    +    editor_ordner_öffnen() {
    +        WinGetTitle, pfad, A
    +        if RegExMatch(pfad, "\*?\K(.*)\\[^\\]+(?= [-*] )", pfad)
    +            if (FileExist(pfad) && A_ThisHotkey = "^+e")
    +                Run explorer.exe /select`,"%pfad%"
    +            else
    +                Run explorer.exe "%pfad1%"
    +    }
    +

    Es dürfen nur Leerraumzeichen, Kommentare oder Direktiven zwischen den Hotkey-Labeln oder Labeln und der Funktion vorkommen. Es werden keine Labels erstellt, wenn Hotkeys auf diese Weise definiert werden; allerdings endet der automatische Ausführungsbereich beim ersten Hotkey, selbst wenn ihm eine Funktion zugewiesen wurde.

    +

    Das Verwenden einer Funktion hat den Vorteil, dass lokale Variablen verwendet werden können, um so Konflikte zu vermeiden, wenn zwei oder mehr Hotkeys die gleichen Variablennamen für unterschiedliche Zwecke verwenden. Außerdem fördert es selbstdokumentierende Hotkeys, wie im Code oben, wo der Funktionsname den Hotkey beschreibt.

    +

    Mit dem Hotkey-Befehl kann man auch eine Funktion oder ein Funktionsobjekt einem Hotkey zuweisen.

    + diff --git a/Objects.htm b/Objects.htm index e52a7c6f..7e0125e9 100644 --- a/Objects.htm +++ b/Objects.htm @@ -31,7 +31,7 @@

    Objekte

    @@ -139,6 +139,7 @@

    Syntax

    obj.item(x) := y
     obj.item[x] := y

    Verbundzuweisungen wie x.y += 1 und --arr[1] werden unterstützt.

    +

    [v1.1.20+]: Parameter können beim Abrufen oder Setzen von Eigenschaften weggelassen werden. Zum Beispiel x[,2]. Scripts können dies nutzen, indem sie Standardwerte für Parameter in Eigenschaften und Meta-Funktionen definieren. Den Methodennamen kann man zudem komplett weglassen, wie z. B. in x[](a). Scripts können dies nutzen, indem sie einen Standardwert für den ersten Parameter der __Call-Meta-Funktion definieren, da er sonst nicht im Wert enthalten wäre. Beachte, dass sich dies von x.(a) unterscheidet, das das gleiche wie x[""](a) ist. Wenn man den Eigenschafts- oder Methodennamen beim Aufrufen eines COM-Objekts weglässt, wird sein "Standardelement" aufgerufen.

    Keys

    Es gibt einige Einschränkungen, welche Werte als Keys innerhalb von Objekten, die mit [], {} oder dem new-Operator erstellt wurden, verwendet werden können:

    @@ -154,11 +155,13 @@

    Erweiterte Grundlagen

    Funktionsverweise [v1.1.00+]

    Enthält die Variable funk einen Funktionsnamen, kann die Funktion über mehrere Wege aufgerufen werden: %funk%() oder funk.(). Allerdings muss dabei die Funktion jedes Mal neu aufgelöst werden. Sobald die Funktion mehr als einmal aufgerufen wird, würde die Effizienz darunter leiden. Zur Verbesserung der Performance speichert man den Funktionsverweis in eine Variable, um sie später wiederzuverwenden:

    Funk := Func("MeineFunk")
    -

    Um eine Funktion per Verweis aufzurufen, muss die folgende Syntax verwendet werden:

    -
    Rückgabewert := Funk.(Parameter)
    +

    Eine Funktion kann mithilfe der folgenden Syntax per Verweis aufgerufen werden:

    +
    +RückWert := %Func%(Params)     ; Benötigt v1.1.07+
    +RückWert := Func.Call(Params)  ; Benötigt v1.1.19+
    +RückWert := Func.(Params)      ; Nicht empfohlen
    +

    Um mehr über zusätzliche Eigenschaften von Funktionsverweisen zu erfahren, siehe Func-Objekt.

    -

    Bekannte Einschränkung:

    -

    Mehrdimensionale Arrays

    AutoHotkey unterstützt "mehrdimensionale" Arrays - das sind Arrays innerhalb von anderen Arrays. Eine Tabelle beispielsweise könnte man als Array mit Reihen ansehen, bei dem jede Reihe ein Array mit Spalten ist. In diesem Fall kann der Inhalt der Spalte y von der Reihe x mit einer der folgenden Methoden gesetzt werden:

    @@ -240,7 +243,7 @@

    Prototypen

    Klassen [v1.1.00+]

    -

    Aufgrund der einfachen Nutzung und seines Bekanntheitsgrades kann das "class"-Schlüsselwort verwendet werden, um ein base-Objekt konstruieren zu können. Eine einfache Klassendefinition könnte wie folgt aussehen:

    +

    Im Grunde ist eine "Klasse" eine Reihe oder Kategorie von Dingen, die einige Eigenschaften oder Attribute haben. Da ein Base- oder Prototyp-Objekt Eigenschaften und Verhaltensweisen für eine Reihe von Objekten definiert, kann man es auch als Klassenobjekt bezeichnen. Der Einfachheit halber können Base-Objekte wie folgt mithilfe des Schlüsselworts "class" definiert werden:

    class Klassenname extends BaseKlassenname
     {
         InstanzVar := Ausdruck
    @@ -256,7 +259,7 @@ 

    Klassen [v1.1.00+]

    ... } - Eigenschaft[] + Eigenschaft[] ; Die eckigen Klammern sind optional { get { return ... @@ -268,6 +271,7 @@

    Klassen [v1.1.00+]

    }

    Beim Laden des Scripts würde mit diesem Beispiel ein Objekt konstruiert und in die globale (oder seit v1.1.05 in die superglobale) Variable Klassenname gespeichert werden. Vor v1.1.05 war es notwendig, eine Deklaration wie global Klassenname anzugeben, um diese Klasse innerhalb einer Funktion zu verweisen, sofern die Funktion nicht global-behandelnd war. Wenn extends BaseKlassenname vorhanden ist, muss der BaseKlassenname der vollständige Name einer anderen Klasse sein (seit v1.1.11 spielt die Reihenfolge, in der sie definiert werden, keine Rolle mehr). Der vollständige Name jeder Klasse ist in objekt.__Class gespeichert.

    +

    Innerhalb dieser Dokumentation bedeutet das Wort "Klasse" in der Regel ein Klassenobjekt, das mit dem Schlüsselwort class erstellt wurde.

    Klassendefinitionen können Variablendeklarationen, Methodendefinitionen und Unterklassendefinitionen enthalten.

    Instanzvariablen [v1.1.01+]

    @@ -349,6 +353,7 @@

    Konstruktion und Destruktion

    DllCall("GlobalFree", "ptr", this.ptr) } }
    +

    __Delete wird nicht bei Objekten aufgerufen, die den Key "__Class" haben. Klassenobjekte haben standardmäßig diesen Key.

    Meta-Funktionen

    @@ -393,10 +398,9 @@ 

    Meta-Funktionen

  • Set: Wenn nur ein Key-Parameter angegeben wurde, speichere den Key und Wert in das Zielobjekt und gebe den zugewiesenen Wert zurück. Wenn mehrere Parameter angegeben wurden, erstelle ein neues Objekt und speichere es, und verwende dabei den ersten Parameter als Key; rufe dann das neue Objekt auf, um die restlichen Parameter zu behandeln. (Siehe Mehrdimensionale Arrays.)
  • - -

    Bekannte Einschränkungen:

    - + +

    Bekannte Einschränkung:

    +

    Dynamische Eigenschaften

    Mit __Get und __Set können Eigenschaften implementiert werden, deren Werte auf irgendeiner Weise berechnet oder beschränkt sind. Zum Beispiel können sie verwendet werden, um ein "Farbe"-Objekt mit R, G, B und RGB-Eigenschaften zu implementieren, wo tatsächlich nur der RGB-Wert gespeichert wird:

    @@ -469,7 +473,7 @@

    Objekte als Funktionen

    ListVars Pause }
    -

    Diese Technik, kombiniert mit Klassendefinitionen, bietet eine bequeme Möglichkeit, dynamische Eigenschaften zu definieren, ähnlich wie im vorherigen Abschnitt:

    +

    Mit dieser Technik kann ein Objekt erstellt werden, das als Meta-Funktion fungiert, um z. B. dynamische Eigenschaften zu definieren, ähnlich wie die im vorherigen Abschnitt. (Beachte allerdings, dass dieses Beispiel durch die Unterstützung von Eigenschaften ersetzt wurde.) Zum Beispiel:

    blau := new Farbe(0x0000ff)
     MsgBox % blau.R "," blau.G "," blau.B
     
    diff --git a/Tutorial.htm b/Tutorial.htm
    index a4795a37..a083e2f8 100644
    --- a/Tutorial.htm
    +++ b/Tutorial.htm
    @@ -106,7 +106,7 @@ 

    a. AutoHotkey herunterladen und installieren

    Bevor du lernst, wie man AutoHotkey (AHK) verwendet, muss du es herunterladen. Nachdem du es heruntergeladen hast, musst du es möglicherweise erst installieren. Aber das ist abhängig davon, welche Version du willst. In diesem Guide verwenden wir den Installer, da er am einfachsten einzurichten ist. diff --git a/Variables.htm b/Variables.htm index 28717e2d..5a137666 100644 --- a/Variables.htm +++ b/Variables.htm @@ -335,7 +335,7 @@

    Script-Eigenschaften

    A_ThisLabel
    [v1.0.46.16+] - Der Name des Labels (Subroutine), das gerade ausgeführt wird (ansonsten leer); zum Beispiel: MeinLabel. Diese Variable wird aktualisiert, sobald das Script Gosub/Return oder Goto ausführt. Sie wird auch bei automatisch aufgerufenen Labels wie Timers, GUI-Threads, Menüpunkte, Hotkeys, Hotstrings, OnClipboardChange und OnExit aktualisiert. Allerdings wird A_ThisLabel nicht aktualisiert, wenn die Ausführung in so einem Label "hineinfällt"; falls das passiert, wird A_ThisLabel den vorherigen Wert beibehalten. Siehe auch: A_ThisHotkey und IsLabel() + Der Name des Labels (Subroutine), das gerade ausgeführt wird (ansonsten leer); zum Beispiel: MeinLabel. Diese Variable wird aktualisiert, sobald das Script Gosub/Return oder Goto ausführt. Sie wird auch bei automatisch aufgerufenen Labels wie Timers, GUI-Threads, Menüpunkte, Hotkeys, Hotstrings, OnClipboardChange (Label) und OnExit aktualisiert. Allerdings wird A_ThisLabel nicht aktualisiert, wenn die Ausführung in so einem Label "hineinfällt"; falls das passiert, wird A_ThisLabel den vorherigen Wert beibehalten. Siehe auch: A_ThisHotkey und IsLabel() A_AhkVersion @@ -579,7 +579,7 @@

    GUI-Fenster und Menüleisten

    A_EventInfo

    Enthält zusätzliche Informationen über die folgenden Ereignisse:

    +

    ULT [v1.1.20+]: Ändert die Groß-/Kleinschreibung eines String-Wertes -- Upper (groß), Lower (klein) oder Title (Anfangsbuchstabe groß). Nur mit dem Typ s gültig. Zum Beispiel {:U} oder {:.20Ts}. Kleingeschriebenes l und t werden auch unterstützt, aber u ist für vorzeichenlose Integer reserviert.

    Typ: Ein Zeichen, das kennzeichnet, wie der Eingabewert interpretiert werden soll. Fehlt diese Angabe, gilt standardmäßig s.

    diff --git a/commands/Gui.htm b/commands/Gui.htm index 32a33dbd..9339598e 100644 --- a/commands/Gui.htm +++ b/commands/Gui.htm @@ -268,7 +268,11 @@

    Position und Größe von Steuerelementen anpassen

    Speichern von und Reagieren auf Benutzereingaben

    V: Variable. Verbindet eine Variable mit einem Steuerelement. Nach dem Buchstaben V kann der Name einer globalen Variable angegeben werden (oder eine lokale ByRef-Variable, die auf eine globale Variable verweist, oder eine statische Variable seit v1.0.46.01). Zum Beispiel würde vMeinEdit den Inhalt des Steuerelements in die Variable MeinEdit speichern, sobald Gui Submit verwendet wird. Das Zuweisen von Variablen ist auch bei Steuerelementen hilfreich, die nicht eingabefähig sind (z. B. ein Text oder GroupBox), weil die Namen solcher Variablen beim Verwenden von GuiControl, GuiControlGet und A_GuiControl auch als eindeutige Kennung für Steuerelemente dienen können. Hinweis: Gui Submit ändert weder die Inhalte der Variablen von nicht-eingabefähigen Steuerelementen (z. B. Text oder GroupBox), noch von anderen, wie in ihren Sektionen beschrieben (z. B. ListView und TreeView).

    -

    G: Gosub (g-label). Startet automatisch eine Subroutine, wenn der Benutzer ein Steuerelement anklickt oder ändert. Gebe nach dem Buchstaben G den Namen des Labels an, das ausgeführt werden soll. Man kann gCancel angeben, um ein indirektes Gui Cancel durchzuführen (aber falls ein Label namens "Cancel" im Script bereits vorkommt, wird dieser stattdessen ausgeführt). Die Subroutine kann auf folgende integrierte Variablen zurückgreifen: A_Gui, A_GuiControl, A_GuiEvent und A_EventInfo.

    +

    G: Gosub (g-label). Startet automatisch eine Subroutine oder Funktion, wenn der Benutzer ein Steuerelement anklickt oder ändert. Gebe nach dem Buchstaben G den Namen des Labels an, das ausgeführt werden soll. Man kann gCancel angeben, um ein indirektes Gui Cancel durchzuführen (aber falls ein Label namens "Cancel" im Script bereits vorkommt, wird dieser stattdessen ausgeführt). Die Subroutine kann auf folgende integrierte Variablen zurückgreifen: A_Gui, A_GuiControl, A_GuiEvent und A_EventInfo.

    +

    [v1.1.20+]: Wenn es kein gültiger Labelname ist, kann stattdessen ein Funktionsname verwendet werden. Alternativ kann mit dem GuiControl-Befehl ein Funktionsobjekt mit dem Steuerelement verbunden werden. Die Funktion kann optional die folgenden Parameter akzeptieren (wo gCtrlEvent die Funktion setzt):

    +
    CtrlEvent(CtrlHwnd, GuiEvent, EventInfo, ErrorLevel)
    +

    Die Bedeutung der Parameter ist vom Typ des Steuerelements abhängig.

    +

    Steuerelemente: Gewöhnliche Styles und Optionen

    Hinweis: Vorzeichenlose Eigenschaften werden standardmäßig hinzugefügt; zum Beispiel ist Wrap das gleiche wie +Wrap. Dagegen würde -Wrap die Eigenschaft zur Zeilenumbrechung entfernen.

    AltSubmit: Verwendet eine alternative Übermittlungsmethode. Bei DropDownList, ComboBox oder ListBox bewirkt Gui Submit, dass die Position des ausgewählten Elements gespeichert wird, anstatt dessen Text. ComboBox: Ist kein Element ausgewählt, wird der Text im Eingabefeld abgespeichert; DropDownList oder ListBox: Ist kein Element ausgewählt, werden ihre zugewiesenen Ausgabevariablen leer gemacht. Hinweis: AltSubmit beeinflusst auch das Verhalten von GuiControlGet, wenn der Inhalt von solchen Steuerelementen abgerufen wird.

    @@ -293,17 +297,38 @@

    Steuerelemente: Ungewöhnliche Styles und Optionen

    (Unbenannter Style): Verwende ein Plus- oder Minuszeichen, gefolgt von einer dezimalen oder hexadezimalen Style-Nummer. Vorzeichenlose Styles werden standardmäßig hinzugefügt.

    (Unbenannter ExStyle): Verwende ein Plus- oder Minuszeichen, gefolgt von dem Buchstaben "E" und einer dezimalen oder hexadezimalen erweiterten Style-Nummer. Vorzeichenlose Styles werden standardmäßig hinzugefügt. Zum Beispiel würde E0x200 den WS_EX_CLIENTEDGE-Style hinzufügen, der einen Rahmen mit abgesenktem Rand bereitstellt, welcher gut geeignet für Picture-Steuerelemente und ähnliches ist. Weitere nicht-dokumentierte Styles findet man auf www.microsoft.com, z. B. mit der Suche nach WS_EX_CLIENTEDGE.

    -

    Fensterereignisse

    +

    Fensterereignisse

    Die folgenden Label (Subroutinen) werden automatisch einem GUI-Fenster zugeordnet, falls diese im Script vorhanden sind:

    + +

    [v1.1.20+]: Wenn ein Label nicht für das angegebene Ereignis existiert, kann stattdessen eine Funktion mit diesem Namen aufgerufen werden. Die Funktion kann optional das HWND des GUI über ihren ersten Parameter abrufen. Einige Ereignisse haben zusätzliche Parameter.

    +

    Abgesehen vom ersten Fenster müssen bei anderen Fenstern deren Namen oder Nummern (falls vorhanden) angegeben werden, damit sie die oben genannten Labels verwenden können. Zum Beispiel würden 2GuiEscape und 2GuiClose die Standard-Label des zweiten Fensters sein, während MeinGuiGuiEscape und MeinGuiGuiClose die Standard-Label für MeinGui sind. Um einen benutzerdefinierten Präfix zu setzen, verwende Gui +Label.

    +

    GuiClose: Startet, wenn das Fenster mit einer der folgenden Methoden geschlossen wird: Drücken des X-Buttons in der Titelleiste, Auswählen von "Schließen" im Systemmenü oder per WinClose. Fehlt dieses Label, bewirkt das Schließen des Fensters, dass es einfach versteckt wird, was den gleichen Effekt hat wie Gui Cancel. Einer der häufigsten Maßnahmen für GuiClose ist ExitApp. Zum Beispiel:

    GuiClose:
     ExitApp
    +

    [v1.1.20+]: Wenn GuiClose eine Funktion ist, wird das GUI standardmäßig geschlossen. Die Funktion kann das verhindern, indem sie wie folgt einen Integer ungleich null zurückgibt:

    +
    GuiClose(GuiHwnd) {  ; Dieser Parameter ist optional.
    +    MsgBox 4,, Wollen Sie wirklich das GUI schließen?
    +    ifMsgBox No
    +        return true  ; true = 1
    +}
    +

    GuiEscape: Startet, wenn der Benutzer die ESC-Taste drückt, während das GUI-Fenster aktiv ist. Fehlt dieses Label, wird das Drücken der ESC-Taste nichts bewirken. Bekannte Einschränkung: Sollte das erste Steuerelement im Fenster deaktiviert sein (wahrscheinlich abhängig vom Typ des Steuerelements), wird das GuiEscape-Label nicht ausgeführt. Dieser Effekt könnte auch durch andere Umstände ausgelöst werden.

    +

    GuiSize: Startet, wenn das Fenster skaliert, minimiert, maximiert oder wiederhergestellt wird. Die integrierten Variablen A_GuiWidth und A_GuiHeight enthalten jeweils die neue Breite und Höhe des Client-Fensterbereichs (das ist der Bereich ohne Rahmen, Titelleiste und Menüleiste). Außerdem enthalten A_EventInfo und ErrorLevel jeweils eine der folgenden Zahlen:

    0: Das Fenster wurde wiederhergestellt oder dessen Größe auf normale Weise geändert, wie durch Ziehen des Rahmens.
    1: Das Fenster wurde minimiert.
    2: Das Fenster wurde maximiert.

    Ein Script kann GuiSize dazu verwenden, die Position und Größe der Steuerelemente neu anzupassen, während der Benutzer die Größe des Fensters ändert. Dieser Ablauf kann z. B. mit dem "Anchor"-Script von Titan via #Include vereinfacht werden.

    +

    [v1.1.20+]: Wenn GuiSize eine Funktion ist, sind seine Parameter wie folgt:

    +
    GuiSize(GuiHwnd, EventInfo, Breite, Höhe)
    +

    GuiContextMenu: Startet immer dann, wenn der Benutzer ein Rechtsklick im Fenster macht (außer Titelleiste und Menüleiste). Es wird auch gestartet, wenn die MENÜ-Taste oder UMSCHALT+F10 gedrückt wird. Im Gegensatz zu den meisten anderen GUI-Labels können mehrere Threads von diesem Label vorhanden sein. Innerhalb des GuiContextMenu-Labels sind folgende integrierte Variablen verfügbar:

    1. A_GuiControl, die den Text oder Variablennamen des Steuerelements enthält, das das Ereignis empfangen hat (leer, wenn nichts).
    2. @@ -314,6 +339,10 @@

      Fensterereignisse

    3. A_GuiEvent, die das Wort "RightClick" enthält, wenn der Benutzer ein Rechtsklick macht, oder "Normal", wenn das Menü durch die MENÜ-Taste oder UMSCHALT+F10 ausgelöst worden ist.

    Hinweis: Da die Steuerelemente Edit und MonthCal ihre eigenen Kontextmenüs haben, wird ein Rechtsklick auf solche Steuerelemente GuiContextMenu nicht starten.

    +

    [v1.1.20+]: Wenn GuiContextMenu eine Funktion ist, sind seine Parameter wie folgt:

    +
    GuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IstRechtsklick, X, Y)
    +

    CtrlHwnd ist leer, wenn das Ereignis nicht über einen Steuerelement abgerufen wurde. IstRechtsklick ist wahr, wenn A_GuiEvent den String RightClick enthält.

    +

    GuiDropFiles: Startet immer dann, wenn Dateien oder Ordner per Drag&Drop auf das Fenster abgelegt worden sind (wenn das Label bereits läuft, werden Drop-Ereignisse ignoriert). Innerhalb des GuiDropFiles-Labels sind folgende integrierte Variablen verfügbar:

    1. A_GuiControl, die den Text oder Variablennamen des Steuerelements enthält, auf dem die Dateien abgelegt worden sind (leer, wenn keine).
    2. @@ -343,7 +372,15 @@

      Fensterereignisse

      Loop, parse, FileList, `n MsgBox Dateinummer %A_Index% ist:`n%A_LoopField%.

      Soll Drag&Drop nur vorübergehend bei einem Fenster deaktiviert werden, entferne den WS_EX_ACCEPTFILES-Style per Gui -E0x10. Mit Gui +E0x10 kann das wieder aktiviert werden.

      +

      [v1.1.20+]: Wenn GuiDropFiles eine Funktion ist, sind seine Parameter wie im unten gezeigten Beispiel. CtrlHwnd ist leer, wenn Dateien auf das GUI selbst abgelegt wurden. DateiArray ist ein Array (Objekt) mit Dateinamen, wo DateiArray[1] die erste Datei ist und DateiArray.MaxIndex() die Anzahl der Dateien zurückgibt. Mit einer For-Schleife kann man die Dateien durchgehen:

      +
      GuiDropFiles(GuiHwnd, DateiArray, CtrlHwnd, X, Y) {
      +    for i, file in DateiArray
      +        MsgBox Datei %i% ist:`n%file%
      +}
      +
      +

      Erkennen von und reagieren auf andere Ereignisse: Andere Arten von GUI-Ereignissen können per OnMessage() erkannt und verarbeitet werden. Zum Beispiel kann ein Script dazu gebracht werden, immer dann kontextabhängige Hilfe per ToolTip anzuzeigen, wenn der Benutzer den Mauszeiger über bestimmte Steuerelemente im Fenster bewegt. Siehe dazu das Beispiel mit GUI-ToolTip.

      +

      Mehrere GUI-Fenster erstellen

      Um neben dem Standard-Fenster auch andere Fenster bearbeiten zu können, füge dessen Name oder Nummer (oder seit v1.1.03 dessen HWND) gefolgt von einem Doppelpunkt vor dem Unterbefehl wie folgt ein:

      Gui, MeinGui:Add, Text,, Text für das Über-Fenster.
      @@ -351,7 +388,7 @@ 

      Mehrere GUI-Fenster erstellen

      Mit Gui MeinGui:Default kann verhindert werden, dass das oben genannte Präfix "MeinGui:" angegeben werden muss. Innerhalb eines GUI-Threads, der das gleiche Fenster verarbeitet, welches den Thread ausgeführt hat, ist das Präfix außerdem nicht notwendig.

      [v1.1.03+]: Für die Gui-Namen gelten die gleichen Regeln wie bei Variablennamen. Jede Nummer größer als 99 oder länger als zwei Zeichen (wie z. B. 0x01) muss das HWND eines vorhandenen Gui-Fensters sein, denn ansonsten würde dieser Befehl fehlschlagen. Je nach verfügbaren Systemressourcen können beliebig viele Fenster erstellt werden.

      [v1.1.04+]: Mit Gui, New können beliebig viele unbenannte GUI-Fenster erstellt werden.

      -

      Abgesehen vom ersten Fenster müssen bei anderen Fenstern deren Namen oder Nummern (falls vorhanden) angegeben werden, damit sie die oben genannten Labels verwenden können. Zum Beispiel würden 2GuiEscape und 2GuiClose die Standard-Label des zweiten Fensters sein, während MeinGuiGuiEscape und MeinGuiGuiClose die Standard-Label für MeinGui sind. Um benutzerdefinierte Labelnamen zu verwenden, siehe Gui +Label.

      +

      GUI-Ereignisse, Threads und Subroutinen

      Ein GUI-Thread wird wie jeder andere Thread definiert, der aufgrund einer GUI-Aktion gestartet wurde. Zu den GUI-Aktionen gehört beispielsweise das Auswählen eines Menüpunkts oder das Ausführen eines g-Labels (z. B. beim Drücken eines Buttons).

      Bei einem GUI-Thread ist der Standardfenstername der Name des Fensters, das diesen Thread gestartet hat. Nicht-GUI-Threads verwenden standardmäßig eine 1.

      diff --git a/commands/GuiControl.htm b/commands/GuiControl.htm index 6062134b..965da092 100644 --- a/commands/GuiControl.htm +++ b/commands/GuiControl.htm @@ -23,8 +23,10 @@

      Parameter

      SteuerelementID

      Wenn das Ziel-Steuerelement eine zugeordnete Variable hat, kann der Name der Variable als SteuerelementID angegeben werden (diese Methode hat Vorrang vor der nächsten Methode). Aus diesem Grund empfiehlt es sich, jedes Steuerelement mit einer Variable zu verbinden, so dass es später via GuiControl oder GuiControlGet zugreifbar ist, selbst wenn es nicht eingabefähig ist (z. B. GroupBox oder Text).

      -

      Ansonsten kann SteuerelementID entweder ClassNN (Klassenname und Instanznummer des Steuerelements) oder der Text des Steuerelements sein, die beide mit Windows Spy ermittelt werden können. Verwendet man Text, ist das Übereinstimmungsverhalten abhängig von SetTitleMatchMode. Hinweis: Der Dateiname eines Picture-Steuerelements (der zum Zeitpunkt seiner Erstellung angegeben wurde) kann auch als SteuerelementID verwendet werden.

      -

      [v1.1.04+]: SteuerelementID kann das HWND eines Steuerelements sein. Wie bei allen anderen Werten für SteuerelementID auch, muss das Gui angegeben werden, falls sich das Steuerelement nicht auf dem Standard-Gui befindet.

      +

      Ansonsten kann SteuerelementID entweder ClassNN (Klassenname und Instanznummer des Steuerelements) oder der Text des Steuerelements sein, die beide mit Windows Spy ermittelt werden können. Verwendet man Text, ist das Übereinstimmungsverhalten abhängig von SetTitleMatchMode. Hinweis: Der Dateiname eines Picture-Steuerelements (der zum Zeitpunkt seiner Erstellung angegeben wurde) kann auch als SteuerelementID verwendet werden.

      +

      [v1.1.04+]: SteuerelementID kann das HWND eines Steuerelements sein.

      +

      Befindet sich das Steuerelement nicht auf dem Standard-GUI, muss der Name des GUI auch angegeben werden -- außer in [v1.1.20+], wenn SteuerelementID ein HWND ist, da jedes HWND einzigartig ist. Siehe Bemerkungen, um mehr darüber zu erfahren.

      +
      Param3

      Dieser Parameter kann weggelassen werden, solange er nicht von einem Unterbefehl aus der unteren Liste benötigt wird.

      @@ -78,12 +80,16 @@

      Unterbefehle

      Im nächsten Beispiel wird der OK-Button zum neuen Standard-Button gemacht:

      GuiControl, +Default, OK

      Zwar werden Styles und erweiterte Styles auch erkannt, allerdings können ein paar von denen nicht angewendet oder entfernt werden, nachdem ein Steuerelement erstellt wurde. ErrorLevel wird auf 0 gesetzt, wenn mindestens eine der angegebenen Änderungen erfolgreich durchgeführt wurde. Ansonsten wird es auf 1 gesetzt, um zu zeigen, dass keine einzige Änderung angewendet werden konnte. Auch wenn eine Änderung erfolgreich angewendet wurde, hat das Steuerelement immer noch die Wahl, sie zu ignorieren.

      +

      [v1.1.20+]: Um ein Funktionsobjekt zum Behandeln von Ereignissen des Steuerelements zu setzen, muss Param3 ein einzelner Variablenverweis sein, wie es in den folgenden beiden Beispielen gezeigt wird. Andere Ausdrücke, die Objekte zurückgeben, werden zurzeit nicht unterstützt.

      +
      GuiControl +g, SteuerelementID, %FunkObj%
      +GuiControl +g, >SteuerelementID, % FunkObj
      +

      Bemerkungen

      Um neben dem Standard-Fenster auch ein anderes Fenster einzubeziehen (siehe unten), muss dessen Name oder Nummer, gefolgt von einem Doppelpunkt, vor dem Unterbefehl wie folgt eingefügt werden:

      GuiControl, MeinGui:Show, MeinButton
       GuiControl, MeinGui:, MeineListBox, Element1|Element2
      -

      Dies ist auch dann notwendig, wenn SteuerelementID eine zugeordnete Variable oder HWND eines Steuerelements ist.

      +

      Dies ist auch dann notwendig, wenn SteuerelementID die zugeordnete Variable eines Steuerelements ist, da jede Variable für mehrere GUI-Fenster verwendet werden kann. In [v1.1.20+] kann der GUI-Name weggelassen werden, wenn SteuerelementID das HWND eines Steuerelements ist.

      Ein GUI-Thread wird wie jeder andere Thread definiert, der aufgrund einer GUI-Aktion gestartet wurde. Zu den GUI-Aktionen gehört beispielsweise das Auswählen eines Menüpunkts oder das Ausführen eines g-Labels (z. B. beim Drücken eines Buttons).

      Der Standardfenstername für einen GUI-Thread ist der Name des Fensters, das diesen Thread gestartet hat. Nicht-GUI-Threads verwenden standardmäßig eine 1.

      diff --git a/commands/Hotkey.htm b/commands/Hotkey.htm index 41f21e10..2db94cf5 100644 --- a/commands/Hotkey.htm +++ b/commands/Hotkey.htm @@ -32,8 +32,9 @@

      Parameter

      Label

      Name des Labels, dessen Inhalt beim Drücken des Hotkeys ausgeführt werden soll (als neuer Thread). Es können sowohl normale Label als auch Hotkey/Hotstring-Label verwendet werden. Der eine oder die zwei Doppelpunkte nach dem Labelnamen müssen weggelassen werden. Wenn das Label dynamisch ist (z. B. %VarMitLabelnamen%), könnte man davor IsLabel(VarMitLabelnamen) aufrufen, um zu überprüfen, ob das Label überhaupt vorhanden ist.

      +

      [v1.1.20+]: Wenn es kein gültiger Labelname ist, kann dieser Parameter der Name einer Funktion sein, oder ein einzelner Variablenverweis mit einem Funktionsobjekt. Zum Beispiel Hotkey %funkobj%, On oder Hotkey % funkobj, On. Andere Ausdrücke, die Objekte zurückgeben, werden zurzeit nicht unterstützt. Beim Ausführen des Hotkeys wird die Funktion ohne Parameter aufgerufen. Hotkeys können auch ohne Hotkey-Befehl als Funktionen definiert werden.

      Dieser Parameter kann leer gelassen werden, wenn Tastenname bereits als Hotkey existiert - in diesem Fall bleibt sein Label unverändert. Dies ist sinnvoll, wenn man nur die Optionen des Hotkeys ändern will.

      -

      Wenn das Label angegeben ist, und wurde der Hotkey durch diesen Befehl zuvor deaktiviert, bleibt der Hotkey deaktiviert. Um dies zu verhindern, muss das Wort ON in den Optionen eingefügt werden.

      +

      Wenn das Label oder die Funktion angegeben ist, und wurde der Hotkey durch diesen Befehl zuvor deaktiviert, bleibt der Hotkey deaktiviert. Um dies zu verhindern, muss das Wort ON in den Optionen eingefügt werden.

      Dieser Parameter kann außerdem einer der folgenden speziellen Werte sein:

      On: Der Hotkey wird aktiviert. Wirkungslos, wenn der Hotkey bereits On ist.

      Off: Der Hotkey wird deaktiviert. Wenn der Hotkey bereits Off ist, wird keine Aktion ausgeführt.

      diff --git a/commands/Input.htm b/commands/Input.htm index 59af47f4..70f8404a 100644 --- a/commands/Input.htm +++ b/commands/Input.htm @@ -37,9 +37,11 @@

      Parameter

      MsgBox, Sie haben STRG+C gedrückt. ExitApp

      Hinweis: STRG+A bis STRG+Z sind die Zeichen von Chr(1) bis Chr(26). Außerdem ist es möglich, dass die M-Option einige Tastenkürzel wie STRG+NACH-LINKS dazu bringen kann, sich während eines Inputs falsch zu verhalten.

      -

      T: Zeitlimit (z. B. T3). Die Anzahl an Sekunden, die gewartet werden sollen, bevor der Input beendet und ErrorLevel auf das Wort Timeout gesetzt wird. Hat der Input die Zeit überschritten, wird AusgabeVar auf das gesetzt, was auch immer der Benutzer gerade eingegeben hat. Dieser Wert kann eine Fließkommazahl wie z. B. 2.5 sein.

      -

      V: Sichtbar. Normalerweise wird die Eingabe des Benutzers blockiert (unsichtbar für das Betriebssystem). Verwende diese Option, um die Tastatureingaben des Benutzers direkt an das aktive Fenster senden zu lassen.

      -

      *: Platzhalter (überall finden). Normalerweise muss alles, was der Benutzer eingibt, exakt mit einem Element aus der Vergleichsliste übereinstimmen, damit der Input fortfahren kann. Verwende diese Option, um im gesamten Eingabetext eine Übereinstimmung häufiger finden zu können.

      +

      T: Zeitlimit (z. B. T3). Die Anzahl an Sekunden, die gewartet werden sollen, bevor der Input beendet und ErrorLevel auf das Wort Timeout gesetzt wird. Hat der Input die Zeit überschritten, wird AusgabeVar auf das gesetzt, was auch immer der Benutzer gerade eingegeben hat. Dieser Wert kann eine Fließkommazahl wie z. B. 2.5 sein.

      +

      V: Sichtbar. Normalerweise wird die Eingabe des Benutzers blockiert (unsichtbar für das Betriebssystem). Verwende diese Option, um die Tastatureingaben des Benutzers direkt an das aktive Fenster senden zu lassen.

      +

      *: Platzhalter (überall finden). Normalerweise muss alles, was der Benutzer eingibt, exakt mit einem Element aus der Vergleichsliste übereinstimmen, damit der Input fortfahren kann. Verwende diese Option, um im gesamten Eingabetext eine Übereinstimmung häufiger finden zu können.

      +

      E [v1.1.20+]: Behandelt Einzelzeichen-Endungstasten als Zeichencode anstatt als Tastencode. Dies ermöglicht konsistentere Ergebnisse, wenn sich das Tastaturlayout des aktiven Fensters vom Tastaturlayout des Scripts unterscheidet. Es verhindert auch Tastenkombinationen, die die angegebenen Endungszeichen bei der Eingabe eigentlich nicht erzeugen können; wenn @ beispielsweise eine Endungstaste wäre, würde sie auf einem US-Layout via UMSCHALT+2 ausgelöst werden, aber nicht via STRG+UMSCHALT+2 (wenn die E-Option verwendet wird). Wenn zusätzlich noch die C-Option angegeben ist, unterscheidet das Endungszeichen zwischen Groß- und Kleinschreibung.

      +
      Endtasten

      Eine Liste mit null oder mehreren Tasten, die den Input beenden können, sobald eine von denen gedrückt wird (die Endtaste selbst wird nicht in AusgabeVar geschrieben). Ein auf diese Weise beendeter Input setzt ErrorLevel auf das Wort EndKey, gefolgt von einem Doppelpunkt und den Namen der Endtaste. Beispiele: EndKey:., EndKey:Escape.

      @@ -81,8 +83,13 @@

      ErrorLevel

    - - + +
    Der Input stimmt mit einem Element aus der Vergleichsliste überein.
    EndKey:nameEine der Endtasten wurde zum Beenden des Inputs gedrückt. In diesem Fall wird ErrorLevel auf das Wort EndKey gesetzt, gefolgt von einem Doppelpunkt und den Namen der Endtaste ohne Klammern, z. B. "EndKey:Enter", "EndKey:Escape", etc.Endtaste:Name +

    Eine der Endtasten wurde zum Beenden des Inputs gedrückt. In diesem Fall wird ErrorLevel auf das Wort EndKey gesetzt, gefolgt von einem Doppelpunkt und den Namen der Endtaste ohne Klammern, z. B. "EndKey:Enter", "EndKey:Escape", etc.

    +

    Beachte, dass Name der "normalisierte" Name der Taste ist, egal wie sie in Endtasten geschrieben wurde. Zum Beispiel würde sowohl {Esc} als auch {vk1B} "ErrorLevel:Escape" erzeugen. Mit GetKeyName() kann der normalisierte Name abgerufen werden.

    +

    Wenn die E-Option verwendet wurde, wird Name das aktuell eingegebene Zeichen sein (falls zutreffend). Ansonsten wird der Name auf Basis des aktiven Tastaturlayouts vom Script bestimmt.

    +

    Vor [v1.1.20], wenn der VK-Code der Endungstaste im Bereich von 0x41 (A) bis 0x5A (Z) war, enthielt ErrorLevel üblicherweise das entsprechende ASCII-Zeichen, selbst wenn es nicht für das aktuelle Tastaturlayout korrekt war. In v1.1.20 und höher wird das korrekte Zeichen verwendet. Verwendet man ein Zeichen im Bereich von A bis Z, wird es aus Gründen der Rückwärtskompatibilität großgeschrieben sein; ansonsten in der Regel kleingeschrieben.

    +

    Bemerkungen

    diff --git a/commands/Menu.htm b/commands/Menu.htm index 7a188163..f0b1aa8d 100644 --- a/commands/Menu.htm +++ b/commands/Menu.htm @@ -31,6 +31,8 @@

    Einfügen oder Ändern von Menüpunkten

    Add [, Menüpunktname, Label-oder-Untermenü, Pn]: Dieser Befehl ist für mehrere Zwecke gedacht - er kann einen Menüpunkt einfügen, einen Menüpunkt mit einem neuen Untermenü oder Label aktualisieren, oder einen normalen Menüpunkt in ein Untermenü umwandeln (oder umgekehrt). Wenn Menüpunktname noch nicht existiert, wird er in das Menü eingefügt. Ansonsten wird Menüpunktname mit dem neu angegebenen Label-oder-Untermenü aktualisiert.

    Zum Einfügen einer Menü-Trennlinie müssen alle drei Parameter weggelassen werden.

    Die Label-Subroutine wird als neuer Thread gestartet, wenn der Benutzer den Menüpunkt anklickt (vergleichbar mit Gosub und Hotkey-Subroutinen). Fehlt Label-oder-Untermenü, wird Menüpunktname sowohl als Labelname als auch als Menüpunktname verwendet.

    +

    [v1.1.20+]: Wenn es nicht der Name eines vorhandenen Labels ist, kann Label-oder-Untermenü der Name einer Funktion sein, oder ein einzelner Variablenverweis mit einem Funktionsobjekt. Zum Beispiel %funkobj% oder % funkobj. Andere Ausdrücke, die Objekte zurückgeben, werden zurzeit nicht unterstützt. Optional kann die Funktion wie folgt Parameter definieren:

    +
    Funktionsname(Menüpunktname, Menüpunktposition, Menüname)

    Wenn Menüpunktname ein Untermenü werden soll - also ein Menüpunkt, der ein neues Menü öffnet - muss in Label-oder-Untermenü ein Doppelpunkt und der Menüname eines vorhandenen benutzerdefinierten Menüs angegeben werden. Zum Beispiel:

    Menu, MeinUntermenü, Add, Element1
     Menu, Tray, Add, Dieser Menüpunkt ist ein Untermenü, :MeinUntermenü
    diff --git a/commands/ObjBindMethod.htm b/commands/ObjBindMethod.htm new file mode 100644 index 00000000..674b62ee --- /dev/null +++ b/commands/ObjBindMethod.htm @@ -0,0 +1,37 @@ + + + +ObjBindMethod() + + + + + + + + +

    ObjBindMethod() [v1.1.20+]

    + +

    Erstellt ein BoundFunc-Objekt, das eine Methode des angegebenen Objekts aufruft.

    + +
    BoundFunc := ObjBindMethod(Obj, Methode, Params)
    + +

    Parameter

    +
    + +
    Obj
    +

    Beliebiges Objekt.

    + +
    Methode
    +

    Namen einer Methode.

    + +
    Params
    +

    Beliebige Anzahl von Parametern.

    + +
    + +

    Bemerkungen

    +

    Informationen und Beispiele findest du unter BoundFunc-Objekt.

    + + + diff --git a/commands/OnClipboardChange.htm b/commands/OnClipboardChange.htm new file mode 100644 index 00000000..64787944 --- /dev/null +++ b/commands/OnClipboardChange.htm @@ -0,0 +1,83 @@ + + + +OnClipboardChange + + + + + + + + +

    OnClipboardChange

    + +

    Ein Label namens OnClipboardChange wird automatisch gestartet (falls vorhanden), sobald eine beliebige Anwendung (auch das Script selbst) den Inhalt der Zwischenablage geändert hat. Das Label wird zudem beim Starten des Scripts einmal ausgeführt.

    +

    Die integrierte Variable A_EventInfo enthält:
    + 0, falls die Zwischenablage leer ist;
    +1, falls etwas enthalten ist, das in Textform ist (einschließlich kopierte Dateien);
    +2, falls etwas enthalten ist, das kein Text ist, wie z. B. ein Bild.

    +

    Das folgende Beispiel ist ein funktionierendes Script. Sobald es ausgeführt wird, wird bei jeder Änderung der Zwischenablage kurz ein ToolTip angezeigt.

    +
    #Persistent
    +return
    +
    +OnClipboardChange:
    +ToolTip Datentyp der Zwischenablage: %A_EventInfo%
    +Sleep 1000
    +ToolTip  ; ToolTip deaktivieren.
    +return
    + +  +

    OnClipboardChange() [v1.1.20+]

    +

    Registriert eine Funktion oder ein Funktionsobjekt, die immer dann gestartet werden sollen, wenn sich der Inhalt der Zwischenablage ändert.

    + +
    OnClipboardChange(Func [, HinzufügenEntfernen])
    +

    Parameter

    +
    + +
    Func
    +

    Ein Funktionsname oder Funktionsobjekt, die aufgerufen werden sollen. Die Parameter und der Rückgabewert der Funktion sind unten beschrieben.

    + +
    HinzufügenEntfernen
    +

    Eines der folgenden Werte:
    + 1 (Standard): Rufe die Funktion nach anderen zuvor registrierten Funktionen auf.
    + -1: Rufe die Funktion vor anderen zuvor registrierten Funktionen auf.
    + 0: Rufe die Funktion nicht auf.

    +

    Existiert ein OnClipboardChange-Label, wird das immer zuerst aufgerufen.

    + +
    + +

    Func

    +
    Funktionsname(Typ)
    +
    +
    Typ
    +

    Enthält einen der folgenden Werte:
    + 0, wenn die Zwischenablage gerade leer ist;
    + 1, wenn sie etwas enthält, das Text sein könnte (einschließlich kopierte Dateien aus einem Explorerfenster);
    + 2, wenn sie etwas enthält, das überhaupt kein Text ist, wie z. B. ein Bild.

    + +
    Rückgabewert
    +

    Ist dies die letzte bzw. einzige OnClipboardChange-Funktion, wird der Rückgabewert ignoriert. Ansonsten kann die Funktion einen Integer ungleich null zurückgeben, um zu verhindern, dass nachfolgende Funktionen aufgerufen werden.

    +
    + +

    Beispiel

    +

    Dieses Beispiel ist das gleiche wie das von oben, außer dass die Funktion nicht aufgerufen wird, wenn das Script zum ersten Mal startet; nur wenn sich der Inhalt der Zwischenablage ändert.

    +
    #Persistent
    +OnClipboardChange("ZwischenablageGeändert")
    +return
    +
    +ZwischenablageGeändert(Typ) {
    +    ToolTip Datentyp der Zwischenablage: %Type%
    +    Sleep 1000
    +    ToolTip  ; Versteckt den ToolTip.
    +}
    + +

    Bemerkungen

    +

    Wenn die Zwischenablage geändert wird, während das OnClipboardChange-Label oder -Funktion läuft, geht das Benachrichtigungsereignis verloren. Falls das unerwünscht ist, verwendet Critical in der ersten Zeile des Labels. Allerdings werden dadurch auch andere Threads zwischengespeichert/aufgeschoben (z. B. das Drücken eines Hotkeys), während der OnClipboardChange-Thread läuft.

    +

    Sobald das Script selbst die Zwischenablage ändert, wird sein OnClipboardChange-Label oder seine -Funktion normalerweise nicht sofort ausgeführt. Das heißt, dass Befehle unterhalb des Befehls, der die Zwischenablage geändert hat, wahrscheinlich vorher ausgeführt werden. Um die sofortige Ausführung des Labels oder der Funktion zu erzwingen, verwendet eine kurze Verzögerung wie beispielsweise Sleep 20, nachdem die Zwischenablage geändert wurde.

    + +

    Siehe auch

    +

    Clipboard, OnExit, OnMessage(), RegisterCallback()

    + + + diff --git a/commands/OnExit.htm b/commands/OnExit.htm index 353abf44..7a58b34f 100644 --- a/commands/OnExit.htm +++ b/commands/OnExit.htm @@ -12,27 +12,40 @@

    OnExit

    -

    Bestimmt eine Subroutine, die automatisch ausgeführt werden soll, wenn das Script beendet wird.

    +

    Bestimmt eine Subroutine oder Funktion, die automatisch ausgeführt werden soll, wenn das Script beendet wird.

    -
    OnExit [, Label]
    +
    OnExit [, Label]
    +OnExit(Func [, HinzufügenEntfernen])  ; Benötigt [v1.1.20+]

    Parameter

    Label
    -

    Fehlt dieser Parameter, wird das Script wieder auf sein normales Exit-Verhalten zurückgreifen. Ansonsten kann der Name eines Labels angegeben werden, dessen Inhalt ausgeführt werden soll (als neuer Thread), wenn das Script auf beliebige Weise beendet wird.

    +

    Fehlt dieser Parameter, werden jegliche zuvor registrierten Label deregistriert. Ansonsten kann der Name eines Labels angegeben werden, dessen Inhalt ausgeführt werden soll (als neuer Thread), wenn das Script auf beliebige Weise beendet wird.

    + +
    Func
    +

    Ein Funktionsname oder Funktionsobjekt, die aufgerufen werden sollen, wenn das Script beendet wird. Optional kann die Funktion Parameter definieren, wie unten gezeigt. Wenn eine OnExit-Funktion einen Integer ungleich null zurückgibt, wird das Script nicht beendet. Ansonsten wird das Script beendet, nachdem alle registrierten Funktionen aufgerufen wurden.

    +
    ExitFunk(ExitReason, ExitCode)
    + +
    HinzufügenEntfernen
    +

    Eines der folgenden Werte:
    + 1 (Standard): Rufe die Funktion nach anderen zuvor registrierten Funktionen auf.
    + -1: Rufe die Funktion vor anderen zuvor registrierten Funktionen auf.
    + 0: Rufe die Funktion nicht auf.

    +

    Wenn ein Label (Subroutine) registriert wurde, wird das immer zuerst aufgerufen.

    -

    WICHTIG: Anstatt das Script zu beenden, wird die angegebene Subroutine aufgerufen - das heißt, dass der ExitApp-Befehl in dieser Subroutine verwendet werden muss, wenn man das Script beenden will. Alternativ (wie in den Beispielen weiter unten) kann die OnExit-Subroutine eine MsgBox anzeigen, um die Bestätigung des Benutzers einzufordern - nur wenn der Benutzer JA drückt, würde das Script ExitApp ausführen, um sich selbst zu schließen.

    Bemerkungen

    +

    WICHTIG: Anstatt das Script zu beenden, wird die angegebene Subroutine aufgerufen - das heißt, dass der ExitApp-Befehl in dieser Subroutine verwendet werden muss, wenn man das Script beenden will. [v1.1.20+]: Neue Scripts sollten eine Funktion anstelle einer Subroutine verwenden, um so das Risiko zu verringern, ein Script zu erstellen, das nicht beendet werden kann, und um sicherstellen zu können, dass der übergebene Exitcode an Exit oder ExitApp beibehalten wird.

    +

    [v1.1.20+]: Es können beliebig viele OnExit-Funktionen registriert werden. Wenn zusätzlich noch ein Label (Subroutine) registriert wurde, werden die Funktionen aufgerufen, nachdem die Subroutine ExitApp aufgerufen hat. Eine OnExit-Funktion sollte in der Regel nicht ExitApp aufrufen; wäre dies der Fall, würde das Script sofort beendet werden.

    Die OnExit-Subroutine wird aufgerufen, wenn das Script in irgendeiner Form beendet wird (nur nicht, wenn das Beenden von so etwas wie "Task beenden" erzwungen wird). Sie wird auch aufgerufen, wann immer #SingleInstance und Reload eine vorherige Instanz zum Beenden auffordert.

    Mit OnMessage(0x11, "WM_QUERYENDSESSION") kann das Herunterfahren oder Abmelden des Betriebssystems erkannt und optional abgebrochen werden.

    Der OnExit-Thread nimmt keine Rücksicht auf #MaxThreads (er wird bei Bedarf immer gestartet). Darüber hinaus kann dieser Thread, während er läuft, nicht von anderen Threads unterbrochen werden, einschließlich Hotkeys, benutzerdefinierte Menüpunkte und zeitgesteuerte Subroutinen. Allerdings wird er unterbrochen (und das Script beendet), wenn der Benutzer den Menüpunkt Exit im Tray-Menü oder Hauptmenü auswählt, oder das Script aufgrund von Reload oder #SingleInstance zum Beenden aufgefordert wird. Aus diesem Grund sollte die OnExit-Subroutine so gestaltet werden, dass sie schnell zum Ende kommen kann, sofern der Benutzer das nicht will.

    Wenn der OnExit-Thread auf einen fehlerhaften Zustand wie z. B. Laufzeitfehler stößt, wird das Script beendet. Dadurch wird verhindert, dass das Script aufgrund einer fehlerhaften OnExit-Subroutine nicht mehr beendet werden kann.

    -

    Wenn die OnExit-Subroutine durch einen Exit- oder ExitApp-Befehl mit vorhandenem Exitcode gestartet wurde, wird dieser Code ignoriert und nicht mehr verfügbar sein. Ein neuer Exitcode kann von der OnExit-Subroutine übergeben werden, wenn/sobald sie ExitApp aufruft.

    +

    In v1.1.19 und früher, wenn die OnExit-Subroutine via Exit- oder ExitApp-Befehl aufgerufen wurde, in dem ein Exitcode angegeben ist, wurde dieser Code ignoriert und verworfen. In [v1.1.20+] wird der erste Exitcode verwendet, sofern er nicht durch den Aufruf von ExitApp mit einem neuen Exitcode überschrieben wurde.

    Immer wenn die OnExit-Subroutine aufgrund eines Exitversuchs aufgerufen wird, gelten zu Beginn die Standardeinstellungen bei Befehlen wie SendMode. Diese Standardeinstellungen können im automatischen Ausführungsbereich geändert werden.

    Die integrierte Variable A_ExitReason enthält nur einen Wert, wenn die OnExit-Subroutine entweder gerade läuft oder mindestens einmal aufgrund eines vorherigen Exitversuchs aufgerufen wurde. In solchen Fällen enthält sie eines der folgenden Wörter:

    - +
    @@ -68,20 +81,53 @@

    Bemerkungen

    Logoff Der Benutzer meldet sich ab.

    Siehe auch

    -

    OnMessage(), RegisterCallback(), OnClipboardChange, ExitApp, Shutdown, #Persistent, Threads, Gosub, Return, Menu

    -

    Beispiel

    -
    #Persistent  ; Um das Ergebnis beim Drücken von "Nein" zu sehen, wird das Script aufrecht erhalten.
    +

    OnMessage(), RegisterCallback(), OnClipboardChange, ExitApp, Shutdown, #Persistent, Threads, Gosub, Return, Menu

    + +

    Beispiele

    +

    Die folgenden Beispiele verwenden #Persistent , um zu verhindern, dass das Script automatisch beendet wird. Nachdem du das Script gestartet hast, kannst du einen Rechtsklick auf das Tray-Icon machen und dann Exit auswählen, um die OnExit-Subroutine oder -Funktion zu testen. Klicke danach auf "Ja", um das Script zu beenden, oder auf "Nein", um es weiter laufen zu lassen.

    +
    #Persistent
     OnExit, ExitSub
     return
     
     ExitSub:
    -if A_ExitReason not in Logoff,Shutdown  ; Achte in dieser Zeile darauf, keine Leerzeichen neben dem Komma zu setzen.
    +if A_ExitReason not in Logoff,Shutdown  ; Vermeide in dieser Zeile Leerzeichen neben dem Komma.
     {
    -    MsgBox, 4, , Möchten Sie das Script wirklich beenden?
    +    MsgBox, 4, , Wollen Sie das Script wirklich beenden?
         IfMsgBox, No
             return
     }
    -ExitApp  ; Ein OnExit-Script kann sich nur selbst beenden, wenn es ExitApp in der OnExit-Subroutine verwendet.
    +ExitApp ; Ein Script mit einer OnExit-Subroutine wird nicht beendet, solange die Subroutine kein ExitApp verwendet.
    +  +
    #Persistent
    +
    +; Registriert eine Funktion, die bei Exit aufgerufen werden soll:
    +OnExit("ExitFunk")
    +
    +; Registriert ein Objekt, das bei Exit aufgerufen werden soll:
    +OnExit(ObjBindMethod(MeinObjekt, "Beenden"))
    +
    +ExitFunk(ExitReason, ExitCode)
    +{
    +    if ExitReason not in Logoff,Shutdown
    +    {
    +        MsgBox, 4, , Wollen Sie das Script wirklich beenden?
    +        IfMsgBox, No
    +            return 1  ; OnExit-Funktionen müssen ungleich null zurückgeben, um ein Exit zu verhindern.
    +    }
    +    ; Rufe ExitApp nicht auf -- dies würde verhindern, dass andere OnExit-Funktionen aufgerufen werden können.
    +}
    +
    +class MeinObjekt
    +{
    +    Beenden()
    +    {
    +        MsgBox, MeinObjekt räumt vor dem Beenden auf...
    +        /*
    +        this.SageAufWiedersehen()
    +        this.SchließeNetzwerkVerbindungen()
    +        */
    +    }
    +}
    diff --git a/commands/OnMessage.htm b/commands/OnMessage.htm index 6f5e1e21..48b5edf1 100644 --- a/commands/OnMessage.htm +++ b/commands/OnMessage.htm @@ -12,28 +12,66 @@

    OnMessage()

    -

    Bestimmt eine Funktion, die automatisch aufgerufen werden soll, wenn das Script die angegebene Nachricht empfängt.

    +

    Bestimmt eine Funktion oder ein Funktionsobjekt, die automatisch aufgerufen werden sollen, wenn das Script die angegebene Nachricht empfängt.

    -
    OnMessage(NachrNummer [, "Funktionsname", MaxThreads])
    +
    OnMessage(NachrNummer [, Funktion, MaxThreads])

    Parameter

    NachrNummer

    Die Nummer der Nachricht zwischen 0 und 4294967295 (0xFFFFFFFF), die überwacht oder abgefragt werden soll. Sofern das Überwachen einer Systemnachricht nicht erforderlich ist (also eine unter 0x400), sollte man am besten eine Nummer verwenden, die größer ist als 4096 (0x1000). Dies verringert die Chance, dass interne Nachrichten von AutoHotkey gestört werden.

    -
    Funktionsname
    -

    Ein Funktionsname, der in Anführungszeichen gesetzt werden muss, wenn er ein literaler String ist. Diese Funktion wird automatisch aufgerufen, wenn das Script die NachrNummer empfängt. Lass diesen Parameter weg, um den Namen der Funktion abzurufen, die gerade NachrNummer überwacht (leer, wenn es keine gibt). Verwende einen leeren String ("") oder eine leere Variable, um das Überwachen der NachrNummer auszuschalten.

    +
    Funktion
    +

    Der Name einer Funktion, oder seit [v1.1.20+] ein Funktionsobjekt. Um einen literalen Funktionsnamen zu übergeben, muss er in Anführungszeichen gesetzt werden.

    +

    Wie die Funktion registriert wird und welcher Rückgabewert von OnMessage erfolgt, hängt davon ab, ob dieser Parameter ein String oder ein Funktionsobjekt ist. Einzelheiten findest du unter Funktionsname vs. Objekt.

    +
    -
    MaxThreads
    - [v1.0.47+]
    -

    Normalerweise lässt man diesen Parameter (Integer) weg, um die überwachende Funktion jeweils auf einen einzigen Thread zu begrenzen. Dies ist üblicherweise das Beste, weil das Script sonst Nachrichten in chronologisch falscher Reihenfolge abarbeiten würde, wann immer die überwachende Funktion sich selbst unterbricht. Demzufolge kann Critical als Alternative zu MaxThreads verwendet werden, wie es weiter unten beschrieben wird.

    +
    MaxThreads [v1.0.47+]
    +

    Normalerweise lässt man diesen Parameter (Integer) weg, um die überwachende Funktion jeweils auf einen einzigen Thread zu begrenzen. Dies ist üblicherweise das Beste, weil das Script sonst Nachrichten in chronologisch falscher Reihenfolge abarbeiten würde, wann immer die überwachende Funktion sich selbst unterbricht. Demzufolge kann Critical als Alternative zu MaxThreads verwendet werden, wie es weiter unten beschrieben wird.

    +

    [v1.1.20+]: Standardmäßig werden mehrere Funktionen, die für eine einzige NachrNummer registriert sind, in der Reihenfolge aufgerufen, wie sie registriert wurden. Um eine Funktion zu registrieren, die vor allen anderen registrierten Funktionen erfolgen soll, muss ein negativer Wert bei MaxThreads angegeben werden. Zum Beispiel würde OnMessage(Nachr, Fn,-2) die Funktion Fn vor allen anderen registrierten Funktionen für die Nachricht Nachr aufrufen, und maximal 2 Threads für Fn erlauben. Wenn die Funktion allerdings bereits registriert ist, wird die Reihenfolge nicht geändert, sofern sie nicht de- und dann neuregistriert wurde.

    -

    Rückgabewerte

    -

    Fehlt Funktionsname, wird OnMessage den Namen der Funktion zurückgeben, die gerade NachrNummer überwacht (leer, wenn es keine gibt).

    -

    Wenn Funktionsname explizit leer ist (also ""), wird OnMessage den Namen der Funktion zurückgeben, die gerade NachrNummer überwacht (leer, wenn es keine gibt), und dann die Überwachung von NachrNummer deaktivieren.

    -

    Wenn Funktionsname angegeben ist: Sollte NachrNummer bereits überwacht werden, wird OnMessage den Namen dieser Funktion zurückgeben und die neue Funktion in Kraft setzen. Ansonsten wird OnMessage den Funktionsnamen die NachrNummer überwachen lassen und dann den gleichen Funktionsnamen zurückgeben. In jedem Fall wird ein leerer Wert bei einem Fehler zurückgegeben. Fehler treten auf, wenn Funktionsname: 1) nicht existiert (weil zum Beispiel die Anführungszeichen bei Funktionsname fehlen); 2) mehr als vier Parameter akzeptiert; oder 3) in v1.0.48.05 oder älter ByRef- oder optionale Parameter hat. OnMessage wird auch fehlschlagen, wenn bereits 500 Nachrichten überwacht werden.

    +

    Funktionname vs. Objekt

    +

    OnMessage's Rückgabewert und Verhalten sind abhängig davon, ob der Funktionsparameter ein Funktionsname oder ein Objekt ist.

    + +

    Funktionsname

    +

    Aus Gründen der Abwärtskompatibilität kann höchstens eine Funktion via Name registriert werden, um jede einzigartige NachrNummer zu überwachen -- dies wird auch als "Legacy"-Überwachung bezeichnet.

    +

    Wenn die Legacy-Überwachung das erste Mal registriert wird, ist die Tatsache, ob sie vor oder nach zuvor registrierten Überwachungen aufgerufen wird, abhängig vom MaxThreads-Parameter. Die Überwachung dahingehend zu ändern, eine andere Funktion aufzurufen, beeinflusst nicht die Reihenfolge, sofern die Überwachung nicht erst deregistriert wird.

    +

    Folgendes registriert oder ändert die Legacy-Überwachung für NachrNummer (lass die Anführungszeichen weg, wenn du eine Variable übergeben willst):

    +
    Name := OnMessage(NachrNummer, "Funktionsname")
    +

    Der Rückgabewert ist einer der folgenden:

    + +

    Folgendes deregistriert die aktuelle Legacy-Überwachung für NachrNummer (falls vorhanden) und gibt ihren Namen zurück (leer, wenn sie keinen hat):

    +
    Name := OnMessage(NachrNummer, "")
    +

    Folgendes gibt den Namen der aktuellen Legacy-Überwachung für NachrNummer zurück (leer, wenn sie keinen hat):

    +
    Name := OnMessage(NachrNummer)
    + +

    Funktionsobjekt

    +

    Beliebig viele Funktionsobjekte (einschließlich normale Funktionen) können die angegebene NachrNummer überwachen.

    +

    Beide folgenden Zeilen registrieren ein Funktionsobjekt, das nach allen zuvor registrierten Funktionen aufgerufen wird:

    +
    +OnMessage(NachrNummer, FunkObj)     ; Option 1
    +OnMessage(NachrNummer, FunkObj, 1)  ; Option 2 (MaxThreads = 1)
    +
    +

    Folgendes registriert ein Funktionsobjekt, das vor allen zuvor registrierten Funktionen aufgerufen wird:

    +
    OnMessage(NachrNummer, FunkObj, -1)
    +

    Um ein Funktionsobjekt zu deregistrieren, muss 0 bei MaxThreads angegeben werden:

    +
    OnMessage(NachrNummer, FunkObj, 0)
    + +

    Misserfolg

    +

    Misserfolg tritt auf, wenn Funktion:

    +
      +
    1. kein Objekt ist, kein Name einer benutzerdefinierten Funktion ist, oder ein leerer String ist;
    2. +
    3. wissentlich mehr als vier Parameter benötigt; oder
    4. +
    5. in v1.0.48.05 oder älter ByRef- oder optionale Parameter hat.
    6. +
    +

    In v1.1.19.03 oder älter tritt Misserfolg auch auf, wenn das Script versucht, eine neue Nachricht zu überwachen, während bereits 500 Nachrichten überwacht werden.

    +

    Wenn Funktion ein Objekt ist, wird bei Misserfolg eine Ausnahme ausgelöst. Ansonsten wird ein leerer String zurückgegeben.

    Die Parameter der Funktion

    Eine Funktion, die in OnMessage zum Überwachen von einer oder mehreren Nachrichten angegeben wurde, akzeptiert bis zu vier Parameter:

    @@ -66,6 +104,7 @@

    Weitere verfügbare Informationen für die Funktion

    Was die Funktion per Return zurückgeben sollte

    Verwendet eine überwachende Funktion Return ohne Parameter oder mit einem leeren Wert wie "" (oder verwendet sie überhaupt kein Return), wird die eingehende Nachricht beim Erreichen des Funktionsendes normal fortgesetzt. Das gleiche passiert, wenn man das Ende der Funktion via Exit erzwingt oder einen Laufzeitfehler verursacht (der beispielsweise durch Ausführen einer nicht-existierenden Datei ausgelöst werden kann). Vewendet man als Rückgabewert hingegen einen Integer, wird dieser Wert sofort als Antwort gesendet; das heißt, dass das Programm die Nachricht nicht weiter fortsetzen wird. Zum Beispiel könnte eine Funktion, die WM_LBUTTONDOWN (0x201) überwacht, einen Integer zurückgeben, um das Zielfenster daran zu hindern, benachrichtigt zu werden, dass ein Mausklick erfolgt ist. In vielen Fällen (z. B. als eine Nachricht, empfangen via PostMessage) ist es egal, welcher Integer zurückgegeben wird; aber im Zweifelsfall ist eine 0 am sichersten.

    Der Bereich von gültigen Rückgabewerten ist abhängig davon, ob die script-ausführende EXE-Datei 32- oder 64-Bit ist. Bei einem 32-Bit-Script (A_PtrSize = 4) müssen die Rückgabewerte in einem Bereich von -231 und 232-1 sein, und bei einem 64-Bit-Script (A_PtrSize = 8) in einem Bereich von -263 und 263-1.

    +

    [v1.1.20+]: Mehrere Funktionen, die eine bestimmte Nachrichtennummer überwachen, werden nacheinander aufgerufen, bis eine von denen einen nicht-leeren Wert zurückgibt.

    Allgemeine Bemerkungen

    Im Gegensatz zu einem normalen Funktionsaufruf wird die überwachende Funktion, wenn sie eine neue Nachricht empfängt, als neuer Thread aufgerufen. Aus diesem Grund beginnt die Funktion mit den Standardeinstellungen bei Befehlen wie SendMode und DetectHiddenWindows. Diese Standardeinstellungen können im automatischen Ausführungsbereich geändert werden.

    @@ -79,7 +118,7 @@

    Allgemeine Bemerkungen

    Zeigt das Script einen Dialogfenster wie MsgBox an, werden Nachrichten, die via PostMessage zu einem Steuerelement gesendet werden, nicht überwacht. Zeigt das Script beispielsweise eine MsgBox an und klickt der Benutzer innerhalb eines GUI-Fensters auf einen Button, wird die WM_LBUTTONDOWN-Nachricht direkt zum Button gesendet, ohne dass die überwachende Funktion aufgerufen wird.

    Zwar kann ein externes Programm direkt via PostThreadMessage() oder anderen API-Funktionen Nachrichten zu einem Script-Thread senden, allerdings könnten dabei Nachrichten verloren gehen, wenn das Script einen Dialogfenster wie MsgBox anzeigt. Stattdessen ist es besser, Nachrichten zum Hauptfenster des Scripts oder zu einem seiner GUI-Fenster zu senden.

    Siehe auch

    -

    RegisterCallback(), OnExit, OnClipboardChange, Post/SendMessage, Funktionen, Liste mit Fensternachrichten, Threads, Critical, DllCall()

    +

    RegisterCallback(), OnExit, OnClipboardChange, Post/SendMessage, Funktionen, Liste mit Fensternachrichten, Threads, Critical, DllCall()

    Beispiele

    ; Beispiel: Das folgende Script zeigt, wie Mausklicks innerhalb eines GUI-Fensters überwacht werden können.
     ; Verwandtes Thema: GuiContextMenu
    diff --git a/commands/RegisterCallback.htm b/commands/RegisterCallback.htm
    index b89c5aaf..0eeb016f 100644
    --- a/commands/RegisterCallback.htm
    +++ b/commands/RegisterCallback.htm
    @@ -76,7 +76,7 @@ 

    Speicher

    Jede Verwendung von RegisterCallback() bekommt eine kleine Speichermenge zugewiesen (32 Bytes plus System-Overhead). Da das Betriebssystem diesen Speicher automatisch beim Beenden des Scripts freigibt, muss jedes Script, das eine kleine feste Anzahl an Callbacks zugewiesen bekommt, den Speicher nicht explizit freigegeben. Dagegen sollte ein Script, das RegisterCallback() unendlich oft aufruft, folgende Funktion bei jedem unbenutzten Callback aufrufen:

    DllCall("GlobalFree", "Ptr", Adresse, "Ptr")

    Siehe auch

    -

    DllCall(), OnMessage(), OnExit, OnClipboardChange, Sort's Callback, Critical, Post/SendMessage, Funktionen, Liste mit Fensternachrichten, Threads

    +

    DllCall(), OnMessage(), OnExit, OnClipboardChange, Sort's Callback, Critical, Post/SendMessage, Funktionen, Liste mit Fensternachrichten, Threads

    Beispiele

    ; Beispiel: Das folgende Script zeigt eine Zusammenfassung aller Fenster auf höchster Ebene an.
     
    diff --git a/commands/SetTimer.htm b/commands/SetTimer.htm
    index 6bb74591..ab5b6b7b 100644
    --- a/commands/SetTimer.htm
    +++ b/commands/SetTimer.htm
    @@ -15,17 +15,20 @@ 

    SetTimer

    Lässt eine Subroutine automatisch und wiederholend in einem angegebenen Zeitintervall laufen.

    -
    SetTimer [, Label, Periode|On|Off, Priorität]
    +
    SetTimer [, Label, Periode|On|Off|Delete, Priorität]

    Parameter

    Label

    Name des Labels oder Hotkey-Labels, der angesprungen werden soll, um die Befehle unterhalb von Label auszuführen, bis ein Return oder Exit erreicht wurde. Label kann, wie Parameter und die meisten anderen Befehle auch, einen Variablenverweis wie %MeinLabel% enthalten, um den gespeicherten Namen in der Variable als Ziel zu verwenden.

    -

    [v1.1.01+]: Fehlt das Label, wird stattdessen A_ThisLabel verwendet. Zum Beispiel könnte SetTimer,, Off innerhalb einer Timer-Subroutine verwendet werden, um den Timer zu deaktivieren.

    +

    [v1.1.01+]: Fehlt das Label, wird stattdessen A_ThisLabel verwendet. Zum Beispiel könnte SetTimer,, Off innerhalb einer Timer-Subroutine verwendet werden, um den Timer zu deaktivieren.

    +

    [v1.1.20+]: Wenn es kein gültiger Labelname ist, kann dieser Parameter der Name einer Funktion sein, oder ein einzelner Variablenverweis mit einem Funktionsobjekt. Zum Beispiel SetTimer %funkobj%, 1000 oder SetTimer %funkobj, 1000. Andere Ausdrücke, die Objekte zurückgeben, werden zurzeit nicht unterstützt.

    + -
    Periode|On|Off
    +
    Periode|On|Off|Delete

    On: Reaktiviert einen zuvor deaktivierten Timer mit ihrer früheren Periode. Falls der Timer noch nicht vorhanden ist, wird er erstellt (mit einer Standardperiode von 250). Wenn ein Timer bereits vorhanden ist, der zuvor im Nur-Einmal-Laufen-Modus gestartet wurde, wird er auch dieses Mal nur einmal ausgeführt.

    Off: Deaktiviert einen vorhandenen Timer.

    +

    Delete [v1.1.20+]: Deaktiviert und entfernt einen vorhandenen Timer. Wenn der Timer mit einem Funktionsobjekt verbunden ist, wird das Objekt freigegeben. Nur das Ausschalten eines Timers wird das Objekt nicht freigeben.

    Periode: Erstellt oder aktualisiert einen Timer, indem er diesen Parameter als ungefähre Zeitspanne verwendet, die erreicht werden soll, nachdem die Label-Subroutine gestartet wurde. Nachdem diese Zeitspanne erreicht wurde, wird Label nochmals ausgeführt (sofern das vorherige Label fertig ausgeführt wurde). Der Timer wird automatisch aktiviert. Um dies zu verhindern, muss der Befehl mit Off-Parameter direkt danach ein zweites Mal aufgerufen werden.

    Periode muss ein Integer sein. Verwendet man eine Variable oder einen Ausdruck, werden Nachkommastellen ignoriert.

    Wenn dieser Parameter leer ist und:
    diff --git a/commands/StringLower.htm b/commands/StringLower.htm index 7e79f9c3..bccecea3 100644 --- a/commands/StringLower.htm +++ b/commands/StringLower.htm @@ -33,8 +33,11 @@

    Parameter

    Bemerkungen

    Mit "if var is [not] upper/lower" kann überprüft werden, ob ein Zeichen oder String vollständig groß- oder kleingeschrieben ist.

    Bei diesen und allen anderen Befehlen kann AusgabeVar auch EingabeVar sein, und umgekehrt.

    +

    [v1.1.20+]: Mit Format() kann man auch wie folgt eine Groß-/Kleinschreibungsumwandlung durchführen:

    +
    MsgBox % Format("{:U}, {:L} und {:T}", "groß", "KLEIN", "titel")
    +

    Siehe auch

    -

    IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLeft, StringRight, StringLen, StringReplace

    +

    Format(), IfInString, StringGetPos, StringMid, StringTrimLeft, StringTrimRight, StringLeft, StringRight, StringLen, StringReplace

    Beispiel

    StringUpper, String1, String1  ; Ausgabe kann das gleiche wie Eingabe sein.
     StringLower, String2, String2
    diff --git a/commands/WinActivate.htm b/commands/WinActivate.htm index d87e57d0..9d4e109b 100644 --- a/commands/WinActivate.htm +++ b/commands/WinActivate.htm @@ -33,9 +33,10 @@

    Parameter

    Bemerkungen

    -

    Sollte das Fenster vor seiner Aktivierung bereits minimiert sein, wird es automatisch wiederhergestellt.

    +

    Sollte das Fenster vor seiner Aktivierung bereits minimiert sein, wird es automatisch wiederhergestellt. In v1.1.20 und höher wird das Fenster wiederhergestellt, auch wenn es bereits aktiv ist.

    Es werden 6 Versuche innerhalb von 60 ms unternommen, um das Zielfenster zu aktivieren. Daher ist es üblicherweise nicht notwendig, nach WinActivate WinWaitActive oder IfWinNotActive auszuführen.

    Ist ein übereinstimmendes Fenster bereits aktiv, wird dieses aktiv bleiben, anstatt ein anderes übereinstimmendes Fenster darunter zu aktivieren. Im Falle mehrerer übereinstimmender Fenster wird generell das oberste (aktuell verwendete) Fenster aktiviert. Wenn das unterste (am wenigsten verwendete) Fenster aktiviert werden soll, verwende WinActivateBottom.

    +

    [v1.1.20+]: Wenn das aktive Fenster versteckt und DetectHiddenWindows ausgeschaltet ist, erfolgt nie eine Übereinstimmung. Stattdessen wird ein sichtbares passendes Fenster aktiviert, sofern so eins existiert.

    Wenn ein Fenster unmittelbar nach Aktivieren eines anderen Fensters aktiviert wird, kann es passieren, dass die Buttons der Taskleiste anfangen zu blinken (abhängig vom Betriebssystem und von den Einstellungen). Mit #WinActivateForce kann das verhindert werden.

    Fenstertitel und -texte unterscheiden zwischen Groß- und Kleinschreibung. Solange DetectHiddenWindows deaktiviert ist, werden versteckte Fenster nicht wahrgenommen.

    diff --git a/commands/_IfTimeout.htm b/commands/_IfTimeout.htm index 58bcd22f..53822331 100644 --- a/commands/_IfTimeout.htm +++ b/commands/_IfTimeout.htm @@ -27,8 +27,10 @@

    Parameter

    Bemerkungen

    Ein Zeitlimit wurde implementiert, um lang laufende Ausdrücke daran zu hindern, den Tastatureingabeprozess hinauszuzögern. Sobald der Zeitlimit-Wert überschritten ist, wird der Ausdruck weiter ausgewertet. Der Tastatur-Hook interpretiert den Ausdruck jedoch so, als wäre er bereits als falsch gewertet wurden.

    Ist diese Direktive im Script nicht angegeben, gilt standardmäßig 1000.

    -

    Beachte, dass das System einen eigenen Zeitlimit implementiert hat. Sobald das System-Zeitlimit überschritten ist, wird möglicherweise sowohl der Hotkey als auch die ursprüngliche Funktion der Taste aktiviert. Das System-Zeitlimit ist im DWORD-Wert LowLevelHooksTimeout definiert, der wiederum im folgenden Registry-Key gefunden werden kann:

    +

    Beachte, dass das System sein eigenes Zeitlimit implementiert, definiert im DWORD-Wert LowLevelHooksTimeout im folgenden Registry-Key:

    HKEY_CURRENT_USER\Control Panel\Desktop

    +

    Sobald der Zeitlimit-Wert überschritten ist, wird das System vermutlich aufhören, den Tastatur-Hook des Scripts aufzurufen und dadurch verhindern, dass Hook-Hotkeys weiter laufen, bis der Hook neu registriert oder der Script neu geladen wurde. Der Hook kann üblicherweise durch Sperren und Entsperren aller Hotkeys neu registriert werden.

    +

    Wenn ein angegebener Hotkey mehrere #If-Varianten hat, könnte das Zeitlimit unabhängig auf jede Variante angewendet werden, so dass sich die Wahrscheinlichkeit erhöht, dass das System-Zeitlimit überschritten wird. Dies wird möglicherweise in einer zukünftigen Version geändert.

    Siehe auch

    #If

    Beispiel

    diff --git a/commands/_MaxThreads.htm b/commands/_MaxThreads.htm index 2142fb95..9b691d80 100644 --- a/commands/_MaxThreads.htm +++ b/commands/_MaxThreads.htm @@ -25,7 +25,7 @@

    Parameter

    Bemerkungen

    Diese Einstellung ist global - das heißt, dass die Direktive nur einmal angegeben werden muss (egal wo), um das Verhalten des ganzen Scripts zu beeinflussen.

    Das Verwenden der 1 als Wert ist zwar möglich, aber nicht empfohlen, weil dieser Wert das Starten neuer Hotkeys verhindern würde, wenn das Script ein Dialogfenster wie MsgBox anzeigen würde. Zudem könnten Timer nicht laufen, wenn ein anderer Thread pausiert oder im Wartezustand gesetzt wäre.

    -

    Bis zu zwei der folgenden Thread-Typen können erstellt werden, auch dann, wenn die maximale Anzahl an Threads erreicht wurde: Ein Hotkey, Hotstring, OnClipboardChange, oder ein GUI-Ereignis, wenn die erste Zeile in dessen Subroutine ein ExitApp, Pause, Edit, Reload, KeyHistory, ListLines, ListVars oder ListHotkeys ist. Die OnExit-Subroutine startet immer, egal wieviele Threads vorhanden sind.

    +

    Bis zu zwei der folgenden Thread-Typen können erstellt werden, auch dann, wenn die maximale Anzahl an Threads erreicht wurde: Ein Hotkey, Hotstring, OnClipboardChange, oder ein GUI-Ereignis, wenn die erste Zeile in dessen Subroutine ein ExitApp, Pause, Edit, Reload, KeyHistory, ListLines, ListVars oder ListHotkeys ist. Die OnExit-Subroutine startet immer, egal wieviele Threads vorhanden sind.

    Ist diese Einstellung kleiner als #MaxThreadsPerHotkey, wird die Einstellung von #MaxThreadsPerHotkey effektiv überschrieben.

    Ist diese Direktive im Script nicht angegeben, gilt standardmäßig 10.

    Siehe auch

    diff --git a/misc/Clipboard.htm b/misc/Clipboard.htm index 2b64fd01..48ca173b 100644 --- a/misc/Clipboard.htm +++ b/misc/Clipboard.htm @@ -1,7 +1,7 @@ -Clipboard, ClipboardAll und OnClipboardChange +Clipboard und ClipboardAll @@ -10,7 +10,7 @@ -

    Clipboard, ClipboardAll und OnClipboardChange

    +

    Clipboard und ClipboardAll

    Clipboard ist eine integrierte Variable, die den aktuellen Inhalt der Windows-Zwischenablage enthält, falls dieser in Textform ist. ClipboardAll hingegen enthält alles von der Zwischenablage, wie z. B. Bilder und Formatierung.

    Jede Textzeile in Clipboard endet normalerweise mit einem CR- und LF-Zeichen, die im Script als `r`n ausgedrückt werden können. Dateien (die beispielsweise mit STRG+C kopiert wurden) gelten als Text: Sie werden automatisch in ihren Dateinamen umgewandelt (mit vollständigem Pfad), sobald Clipboard im Script verwendet wird. Um die Dateien einzeln zu extrahieren, befolgt dieses Beispiel:

    @@ -60,23 +60,9 @@

    Hinweise

  • Deluxe Clipboard: Ermöglicht eine unbegrenzte Anzahl an privaten, benannten Zwischenablagen, um einen markierten Text zu kopieren, auszuschneiden, einzufügen, anzuhängen oder auszuschneiden und anzuhängen. www.autohotkey.com/forum/topic2665.html
  • ClipStep: Kontrolliert mehrere Zwischenablagen nur mithilfe von STRG+X/C/V. www.autohotkey.com/forum/topic4836.html
  • +

    OnClipboardChange

    -

    Ein Label namens OnClipboardChange wird automatisch gestartet (falls vorhanden), sobald eine beliebige Anwendung (auch das Script selbst) den Inhalt der Zwischenablage geändert hat. Das Label wird zudem beim Starten des Scripts einmal ausgeführt.

    -

    Die integrierte Variable A_EventInfo enthält:
    - 0, falls die Zwischenablage leer ist;
    -1, falls etwas enthalten ist, das in Textform ist (einschließlich kopierte Dateien);
    -2, falls etwas enthalten ist, das kein Text ist, wie z. B. ein Bild.

    -

    Das folgende Beispiel ist ein funktionierendes Script. Sobald es ausgeführt wird, wird bei jeder Änderung der Zwischenablage kurz ein ToolTip angezeigt.

    -
    #Persistent
    -return
    +

    Scripts können mithilfe von OnClipboardChange Änderungen in der Zwischenablage erkennen.

    -OnClipboardChange: -ToolTip Datentyp der Zwischenablage: %A_EventInfo% -Sleep 1000 -ToolTip ; ToolTip deaktivieren. -return
    -

    Wenn die Zwischenablage geändert wird, während das Label OnClipboardChange läuft, geht das Benachrichtigungsereignis verloren. Falls das unerwünscht ist, verwendet Critical in der ersten Zeile des Labels. Allerdings werden dadurch auch andere Threads zwischengespeichert/aufgeschoben (z. B. das Drücken eines Hotkeys), während der OnClipboardChange-Thread läuft.

    -

    Sobald das Script selbst die Zwischenablage ändert, wird das OnClipboardChange-Label normalerweise nicht sofort ausgeführt. Das heißt, dass Befehle unterhalb des Befehls, der die Zwischenablage geändert hat, wahrscheinlich vorher ausgeführt werden. Um die sofortige Ausführung des Labels zu erzwingen, verwendet eine kurze Verzögerung wie beispielsweise Sleep 20, nachdem die Zwischenablage geändert wurde.

    -

    Siehe auch: OnExit, OnMessage(), RegisterCallback()

    diff --git a/misc/Labels.htm b/misc/Labels.htm index 678089a6..f97bdb69 100644 --- a/misc/Labels.htm +++ b/misc/Labels.htm @@ -41,8 +41,20 @@

    Hotkeys und Hotstrings

    Benannte Schleifen

    Ein Label kann auch dazu verwendet werden, eine Schleife für die Befehle Continue und Break zu identifizieren. Auf diese Weise kann das Script einfach eine beliebige Anzahl an verschachtelten Schleifen fortsetzen oder unterbrechen.

    +

    Funktionen

    +

    In [v1.1.20] und höher können Funktionen anstelle von Labels in einigen Fällen verwendet werden, dazu zählen:

    + +

    +

    Die Vorteile von Funktionen sind, dass sie lokale Variablen verwenden können und dass sie in einigen Fällen (wie z. B. Gui-Steuerelement-Ereignisse) auch Parameter mit nützlichen Informationen akzeptieren.

    +

    Siehe auch

    -

    IsLabel(), A_ThisLabel, Gosub, Goto, OnExit, SetTimer, Hotkey, Gui-Ereignisse, g-Label, OnClipboardChange

    +

    IsLabel(), A_ThisLabel, Gosub, Goto, OnExit, SetTimer, Hotkey, Gui-Ereignisse, g-Label, OnClipboardChange

    diff --git a/objects/Func.htm b/objects/Func.htm index 47ca2b69..cae21e99 100644 --- a/objects/Func.htm +++ b/objects/Func.htm @@ -14,6 +14,8 @@

    Func-Objekt [v1.1.00+]

    Repräsentiert eine benutzerdefinierte oder integrierte Funktion, die vom Script aufgerufen werden kann.

    +

    Informationen zu anderen Objekten, die wie Funktionen aufgerufen werden können, findest du unter Funktionsobjekt.

    +

    Ein Verweis auf ein Func-Objekt wird auch als Funktionsverweis bezeichnet. Um ein Funktionsverweis zu erhalten, verwendet die Func-Funktion zum Beispiel wie folgt:

    fn := Func("Funktion")
     MsgBox % fn.Name "() ist " (fn.IsBuiltIn ? "integriert." : "benutzerdefiniert.")
    @@ -27,6 +29,13 @@

    Func-Objekt [v1.1.00+]

    [v1.1.07+]: %Func%() kann verwendet werden, um eine Funktion via Name oder Verweis aufzurufen, oder um ein Objekt aufzurufen, das die __Call-Meta-Funktion implementiert. Dies sollte anstelle von Func.() verwendet werden, wo auch immer das möglich ist.

    +

    Bind [v1.1.20+]

    +

    Bindet Parameter an die Funktion und gibt ein BoundFunc-Objekt zurück.

    +
    BoundFunc := Func.Bind(Parameter)
    +

    Parameter können beliebig viele Parameter sein.

    +

    Informationen und Beispiele findest du unter BoundFunc-Objekt.

    +
    +

    Name

    Gibt den Funktionsnamen zurück.

    Func.Name
    diff --git a/objects/Functor.htm b/objects/Functor.htm new file mode 100644 index 00000000..99846774 --- /dev/null +++ b/objects/Functor.htm @@ -0,0 +1,78 @@ + + + +Funktionsobjekt + + + + + + + + +

    Funktionsobjekt

    + +

    "Funktionsobjekt" bedeutet in der Regel folgendes:

    +
      +
    • Ein Verweis auf ein Func-Objekt, das entweder eine integrierte Funktion oder eine im Script definierte Funktion repräsentiert.
    • +
    • Ein benutzerdefiniertes Objekt, das wie eine Funktion aufgerufen werden kann. Dies bezeichnet man manchmal auch als "Funktor".
    • +
    • Jedes andere Objekt, das wie eine Funktion aufgerufen werden kann, wie z. B. ein BoundFunc-Objekt oder ein JavaScript-Funktionsobjekt, zurückgegeben von einer COM-Methode.
    • +
    +

    Funktionsobjekte können in Verbindung mit folgenden Dingen verwendet werden:

    + + +

    Benutzerdefiniert

    + +

    Benutzerdefinierte Funktionsobjekte sollten dieses allgemeine Muster folgen:

    +
    class DeinKlassenname {
    +    Call(a, b) {  ; Deklariere Parameter je nach Bedarf, oder ein Array*.
    +        ;...
    +    }
    +    __Call(Methode, args*) {
    +        if (Methode = "")  ; Für %fn%() oder fn.()
    +            return this.Call(args*)
    +        if (IsObject(Methode))  ; Wenn dieses Funktionsobjekt als Methode verwendet wird.
    +            return this.Call(Methode, args*)
    +    }
    +    ;...
    +}
    +
    +

    Welche Teile genau benötigt werden, hängt von der Nutzung ab:

    +
      +
    • Methode ist ein leerer String, wenn das Script %this%() oder this.() verwendet.
    • +
    • Verwendet man das Objekt als eine Methode, wird IsObject(Methode) wahr sein und Methode einen Verweis auf das Zielobjekt enthalten. Wenn x.y sich beispielsweise auf das Funktionsobjekt this bezieht, x.y()this[x]()this.__Call(x)this.Call(x).
    • +
    • [v1.1.20+]: Wenn das Objekt von einem der integrierten Funktionen verwendet wird, die eine Callback-Funktion akzeptieren, wie z. B. OnMessage oder SetTimer, dann ist nur die Call-Methode erforderlich.
    • +
    +

    Die Arbeit kann auch direkt in __Call erfolgen. Allerdings wird das Weiterleiten von __Call nach Call empfohlen, um den Übergang zu AutoHotkey v2 zu erleichtern, weil in dieser Version das Verhalten von %this%() und Methodenaufrufen geändert wird, um die Call-Methode direkt aufzurufen.

    + +

    BoundFunc-Objekt [v1.1.20+]

    +

    Verhält sich wie eine Funktion, aber übergibt nur vordefinierte Parameter an eine andere Funktion.

    +

    Es gibt zwei Möglichkeiten, wie BoundFunc-Objekte erstellt werden können:

    +
      +
    • Durch Aufrufen der Func.Bind()-Methode, die Parameterwerte an eine Funktion bindet.
    • +
    • Durch Aufrufen der ObjBindMethod()-Funktion, die Parameterwerte und Methodennamen an ein Zielobjekt bindet.
    • +
    +

    Im unteren Beispiel wird gezeigt, wie BoundFunc-Objekte aufgerufen werden können. Anderen Methoden werden nicht unterstützt. Wenn das BoundFunc-Objekt aufgerufen wird, ruft es die Funktion oder Methode auf, an der es gebunden wurde, und übergibt alle gebundenen Parameter, gefolgt von denen, die vom Aufrufer übergeben wurden. Zum Beispiel:

    +
    fn := Func("EchteFn").Bind(1)
    +
    +%fn%(2)    ; Zeigt "1, 2"
    +fn.Call(3) ; Zeigt "1, 3"
    +
    +EchteFn(a, b) {
    +    MsgBox %a%, %b%
    +}
    +

    Mit ObjBindMethod() kann eine Methode mit einem Objekt verbunden werden, wenn es nicht möglich ist, einen Verweis auf die Methode selbst abzurufen. Zum Beispiel:

    +
    Datei := FileOpen(A_ScriptFullPath, "r")
    +ZeileAbrufen := ObjBindMethod(Datei, "ReadLine")
    +MsgBox % %ZeileAbrufen%()  ; Zeigt die erste Zeile dieser Datei.
    + + + diff --git a/static/content.js b/static/content.js index 49872594..94aafa9d 100644 --- a/static/content.js +++ b/static/content.js @@ -33,7 +33,7 @@ toc = [ {label:"Object",path:"objects/Object.htm"}, {label:"Enumerator-Objekt",path:"objects/Enumerator.htm"}, {label:"File-Objekt",path:"objects/File.htm"}, - {label:"Func-Objekt",path:"objects/Func.htm"} + {label:"Funktionsobjekte",path:"objects/Functor.htm"} ]} ]}, {label:"Zu AutoHotkey 1.1 wechseln",children: @@ -164,7 +164,7 @@ toc = [ {label:"Asc",path:"Functions.htm#Asc"}, {label:"Chr",path:"Functions.htm#Chr"}, {label:"FileExist",path:"Functions.htm#FileExist"}, - {label:"Format",path:"commands/Format.htm"}, + {label:"Format",path:"commands/Format.htm"}, {label:"GetKeyName/VK/SC",path:"Functions.htm#GetKeyName"}, {label:"GetKeyState",path:"Functions.htm#GetKeyState"}, {label:"InStr",path:"Functions.htm#InStr"}, @@ -173,6 +173,8 @@ toc = [ {label:"IsLabel",path:"Functions.htm#IsLabel"}, {label:"NumGet",path:"commands/NumGet.htm"}, {label:"NumPut",path:"commands/NumPut.htm"}, + {label:"OnClipboardChange",path:"commands/OnClipboardChange.htm"}, + {label:"OnExit",path:"commands/OnExit.htm"}, {label:"OnMessage",path:"commands/OnMessage.htm"}, {label:"RegExMatch",path:"commands/RegExMatch.htm"}, {label:"RegExReplace",path:"commands/RegExReplace.htm"}, @@ -647,6 +649,7 @@ index = [ ["Blind-Modus von Send","commands/Send.htm#blind"], ["BlockInput","commands/BlockInput.htm"], ["Blöcke (Zeilen innerhalb von Klammern)","commands/Block.htm"], + ["BoundFunc-Objekt","objects/Functor.htm#BoundFunc"], ["Break","commands/Break.htm"], ["Puffern / Zwischenspeichern","commands/_MaxThreadsBuffer.htm"], ["integrierte Funktionen","Functions.htm#BuiltIn"], @@ -754,6 +757,7 @@ index = [ ["DriveGet","commands/DriveGet.htm"], ["DriveSpaceFree","commands/DriveSpaceFree.htm"], ["DropDownList-Steuerelemente (GUI)","commands/GuiControls.htm#DropDownList"], + ["Dynamische Funktionsaufrufe","Functions.htm#DynCall"], ["Edit","commands/Edit.htm"], ["Edit-Steuerelemente (GUI)","commands/GuiControls.htm#Edit"], ["Else","commands/Else.htm"], @@ -1036,7 +1040,7 @@ index = [ ["ObjRelease()","commands/ObjAddRef.htm"], ["ObjRemove()","objects/Object.htm#Remove"], ["ObjSetCapacity()","objects/Object.htm#SetCapacity"], - ["OnClipboardChange (label)","misc/Clipboard.htm#OnClipboardChange"], + ["OnClipboardChange","commands/OnClipboardChange.htm"], ["OnExit","commands/OnExit.htm"], ["OnMessage()","commands/OnMessage.htm"], ["Öffnen einer Datei","commands/FileReadLine.htm"], @@ -1319,13 +1323,16 @@ index = [ translate = { hdSearchTxt: "Suchbegriff eingeben ...", hdSearchBtn: "Suchen", - hdSearchLnk: "'https://www.google.com/search?sitesearch=' + location.host + '&q=' + query", + hdSearchLnk: "https://www.google.com/search?sitesearch=ragnar-f.github.io&q={0}", sbContent: "Inhalt", sbIndex: "Index", ftLicense: "Lizenz:", ftExtra: " | Übersetzung: Harald Bootz", cdSelectBtn: "Markieren", - cdDownloadBtn: "Download" + cdDownloadBtn: "Download", + verToolTipAHK_L: "Gilt für:\nAutoHotkey_L Revision {0} und höher\nAutoHotkey v1.0.90.00 und höher", + verToolTipDefault: "Gilt für AutoHotkey {0} und höher", + tutLocalMessage: "Da du dir diese Dokumentation lokal anschaust, hast du wahrscheinlich AutoHotkey bereits installiert und kannst bei Abschnitt b fortfahren.", }; if (!IsInsideCHM() && !IsSearchBot()) { @@ -1385,13 +1392,13 @@ function AddContent() $('.header #search-btn').on('click', function() { var query = $(".header #q").val(); - document.location = eval(translate.hdSearchLnk); + document.location = translate.hdSearchLnk.format(query); }); $('.header #search-form').on('submit', function(event) { event.preventDefault(); var query = $(".header #q").val(); - document.location = eval(translate.hdSearchLnk); + document.location = translate.hdSearchLnk.format(query); }); // @@ -1616,13 +1623,11 @@ function AddChmAndOnlineFeatures() var jel = $(el); var m, title, href, text = jel.text(); if (m = /AHK_L (\d+)\+/.exec(text)) { - title = 'Applies to:\n' - + ' AutoHotkey_L Revision ' + m[1] + ' and later\n' - + ' AutoHotkey v1.0.90.00 and later'; + title = translate.verToolTipAHK_L.format(m[1]); href = '/docs/AHKL_ChangeLog.htm#L' + m[1]; text = text.replace(m[0], 'v1.0.90+'); // For users who don't know what AHK_L was. } else if (m = /v\d\.\d\.(\d+\.)?\d+/.exec(text)) { - title = 'Applies to AutoHotkey ' + m[0] + ' and later'; + title = translate.verToolTipDefault.format(m[0]); if (!m[1]) m[0] = m[0] + '.00'; if (m[0] <= 'v1.0.48.05') @@ -1742,3 +1747,8 @@ function IsSearchBot() { return navigator.userAgent.match(/googlebot|bingbot|slurp/i); } + +String.prototype.format = function() { + var args = arguments; + return this.replace(/\{(\d+)\}/g, function(m, n) { return args[n]; }); +}; diff --git a/static/source/data_index.js b/static/source/data_index.js index 57d0b0fd..7d365760 100644 --- a/static/source/data_index.js +++ b/static/source/data_index.js @@ -209,6 +209,7 @@ index = [ ["Blind-Modus von Send","commands/Send.htm#blind"], ["BlockInput","commands/BlockInput.htm"], ["Blöcke (Zeilen innerhalb von Klammern)","commands/Block.htm"], + ["BoundFunc-Objekt","objects/Functor.htm#BoundFunc"], ["Break","commands/Break.htm"], ["Puffern / Zwischenspeichern","commands/_MaxThreadsBuffer.htm"], ["integrierte Funktionen","Functions.htm#BuiltIn"], @@ -316,6 +317,7 @@ index = [ ["DriveGet","commands/DriveGet.htm"], ["DriveSpaceFree","commands/DriveSpaceFree.htm"], ["DropDownList-Steuerelemente (GUI)","commands/GuiControls.htm#DropDownList"], + ["Dynamische Funktionsaufrufe","Functions.htm#DynCall"], ["Edit","commands/Edit.htm"], ["Edit-Steuerelemente (GUI)","commands/GuiControls.htm#Edit"], ["Else","commands/Else.htm"], @@ -598,7 +600,7 @@ index = [ ["ObjRelease()","commands/ObjAddRef.htm"], ["ObjRemove()","objects/Object.htm#Remove"], ["ObjSetCapacity()","objects/Object.htm#SetCapacity"], - ["OnClipboardChange (label)","misc/Clipboard.htm#OnClipboardChange"], + ["OnClipboardChange","commands/OnClipboardChange.htm"], ["OnExit","commands/OnExit.htm"], ["OnMessage()","commands/OnMessage.htm"], ["Öffnen einer Datei","commands/FileReadLine.htm"], diff --git a/static/source/data_toc.js b/static/source/data_toc.js index cf476563..057d9743 100644 --- a/static/source/data_toc.js +++ b/static/source/data_toc.js @@ -25,7 +25,7 @@ toc = [ {label:"Object",path:"objects/Object.htm"}, {label:"Enumerator-Objekt",path:"objects/Enumerator.htm"}, {label:"File-Objekt",path:"objects/File.htm"}, - {label:"Func-Objekt",path:"objects/Func.htm"} + {label:"Funktionsobjekte",path:"objects/Functor.htm"} ]} ]}, {label:"Zu AutoHotkey 1.1 wechseln",children: @@ -156,7 +156,7 @@ toc = [ {label:"Asc",path:"Functions.htm#Asc"}, {label:"Chr",path:"Functions.htm#Chr"}, {label:"FileExist",path:"Functions.htm#FileExist"}, - {label:"Format",path:"commands/Format.htm"}, + {label:"Format",path:"commands/Format.htm"}, {label:"GetKeyName/VK/SC",path:"Functions.htm#GetKeyName"}, {label:"GetKeyState",path:"Functions.htm#GetKeyState"}, {label:"InStr",path:"Functions.htm#InStr"}, @@ -165,6 +165,8 @@ toc = [ {label:"IsLabel",path:"Functions.htm#IsLabel"}, {label:"NumGet",path:"commands/NumGet.htm"}, {label:"NumPut",path:"commands/NumPut.htm"}, + {label:"OnClipboardChange",path:"commands/OnClipboardChange.htm"}, + {label:"OnExit",path:"commands/OnExit.htm"}, {label:"OnMessage",path:"commands/OnMessage.htm"}, {label:"RegExMatch",path:"commands/RegExMatch.htm"}, {label:"RegExReplace",path:"commands/RegExReplace.htm"}, diff --git a/static/source/data_translate.js b/static/source/data_translate.js index ef7e024f..4810033a 100644 --- a/static/source/data_translate.js +++ b/static/source/data_translate.js @@ -1,11 +1,14 @@ translate = { hdSearchTxt: "Suchbegriff eingeben ...", hdSearchBtn: "Suchen", - hdSearchLnk: "'https://www.google.com/search?sitesearch=' + location.host + '&q=' + query", + hdSearchLnk: "https://www.google.com/search?sitesearch=ragnar-f.github.io&q={0}", sbContent: "Inhalt", sbIndex: "Index", ftLicense: "Lizenz:", ftExtra: " | Übersetzung: Harald Bootz", cdSelectBtn: "Markieren", - cdDownloadBtn: "Download" + cdDownloadBtn: "Download", + verToolTipAHK_L: "Gilt für:\nAutoHotkey_L Revision {0} und höher\nAutoHotkey v1.0.90.00 und höher", + verToolTipDefault: "Gilt für AutoHotkey {0} und höher", + tutLocalMessage: "Da du dir diese Dokumentation lokal anschaust, hast du wahrscheinlich AutoHotkey bereits installiert und kannst bei Abschnitt b fortfahren.", }; \ No newline at end of file diff --git a/static/source/main.js b/static/source/main.js index ff2721df..3ef95de7 100644 --- a/static/source/main.js +++ b/static/source/main.js @@ -56,13 +56,13 @@ function AddContent() $('.header #search-btn').on('click', function() { var query = $(".header #q").val(); - document.location = eval(translate.hdSearchLnk); + document.location = translate.hdSearchLnk.format(query); }); $('.header #search-form').on('submit', function(event) { event.preventDefault(); var query = $(".header #q").val(); - document.location = eval(translate.hdSearchLnk); + document.location = translate.hdSearchLnk.format(query); }); // @@ -287,13 +287,11 @@ function AddChmAndOnlineFeatures() var jel = $(el); var m, title, href, text = jel.text(); if (m = /AHK_L (\d+)\+/.exec(text)) { - title = 'Applies to:\n' - + ' AutoHotkey_L Revision ' + m[1] + ' and later\n' - + ' AutoHotkey v1.0.90.00 and later'; + title = translate.verToolTipAHK_L.format(m[1]); href = '/docs/AHKL_ChangeLog.htm#L' + m[1]; text = text.replace(m[0], 'v1.0.90+'); // For users who don't know what AHK_L was. } else if (m = /v\d\.\d\.(\d+\.)?\d+/.exec(text)) { - title = 'Applies to AutoHotkey ' + m[0] + ' and later'; + title = translate.verToolTipDefault.format(m[0]); if (!m[1]) m[0] = m[0] + '.00'; if (m[0] <= 'v1.0.48.05') @@ -413,3 +411,8 @@ function IsSearchBot() { return navigator.userAgent.match(/googlebot|bingbot|slurp/i); } + +String.prototype.format = function() { + var args = arguments; + return this.replace(/\{(\d+)\}/g, function(m, n) { return args[n]; }); +};