Mousetroke GitHub
Deutsch ▾
Inhaltsverzeichnis

Lua-API#

Das sind alle Funktionen, die die gemeinsame Laufzeit auf ms registriert. Die Beispiele sind Anweisungen für den Einsatz innerhalb von ms_action, wo pos, wid, pid, exe, title und mode verfügbar sind. Siehe Lua-Grundlagen für ein vollständiges Skript und Rezepte für fertige Aktionen.

Konventionen#

Lua-Version: 5.4 (mlua mit lua54 und vendored). nil bedeutet „kein Wert“; ? kennzeichnet einen optionalen Parameter. Funktionen ohne Rückgabewert erscheinen als -> nil. Ein weggelassenes optionales Argument entspricht nil. Übergeben Sie für boolesche Argumente echte boolesche Werte. Ganzzahlparameter kürzen endliche Brüche gegen null und lehnen Werte außerhalb ihres zugrunde liegenden Ganzzahlbereichs ab; verwenden Sie in Skripten Ganzzahlen.

Positionstabellen verwenden benannte Felder {x=..., y=...}, keine Array-Einträge. Nicht unterstützte Mac-Aufrufe protokollieren im Allgemeinen einmal pro Funktion pro Prozess; Getter liefern nil und Setter tun nichts. Ein Setter ohne Rückgabewert ist keine Erfolgsprüfung. Lua-API-Zeichenketten erhalten keine Aktionsvariablen-Ersetzung.

Ablauf und Feedback#

ms.log#

ms.log(...) -> nil

Akzeptiert beliebige Lua-Werte. Mit einer Formatzeichenkette und weiteren Argumenten werden %s, %d, %f, %q und %% unterstützt; andernfalls werden die Werte mit Leerzeichen verbunden. %q fügt kein Lua-Quoting hinzu. Schreibt auf beiden Plattformen eine Lua:-Zeile in das Laufzeitprotokoll. Kein Rückgabewert.

ms.log("pid=%d app=%s", pid, exe)

ms.sleep#

ms.sleep(milliseconds: integer) -> nil

Wartet auf eine nichtnegative Millisekundenanzahl (vorzeichenlose 64-Bit-Zahl). Blockiert auf beiden Plattformen den Worker dieses Skripts; die Gesten-Engine bzw. der Hauptthread läuft weiter. Kein Rückgabewert, und es wird kein Skript-Timeout installiert.

ms.sleep(100)

ms.is_paused#

ms.is_paused() -> boolean

Keine Parameter. Liefert auf beiden Plattformen das manuelle Pausenkennzeichen der Engine. Es meldet weder die automatische Vollbild-Unterdrückung noch einen App-Ausschluss.

ms.log(ms.is_paused())

ms.set_paused#

ms.set_paused(paused: boolean) -> nil

true pausiert; false setzt fort. Kein Rückgabewert. Auf beiden Plattformen unterstützt. Windows sendet einen Befehl an den Tray-Thread, sodass ein unmittelbares is_paused() noch den alten Wert sehen kann. Der Mac wendet die Änderung über die Hauptthread-Brücke an.

ms.set_paused(true)

ms.show_settings#

ms.show_settings() -> nil

Keine Parameter, kein Rückgabewert. Öffnet die Einstellungen auf beiden Plattformen oder holt sie nach vorn.

ms.show_settings()

ms.show_toast#

ms.show_toast(message: string, duration_ms?: integer) -> nil

message ist der angezeigte Text. Die optionale nichtnegative Dauer steht in Millisekunden, Standard 1200. Zeigt auf beiden Plattformen eine Overlay-Meldung an; kein Rückgabewert.

ms.show_toast("Done", 1500)

Tastatureingaben#

ms.keys#

ms.keys(sequence: string, text_by_default?: boolean) -> nil

Parst und sendet die Tastenfolge; der Text-zuerst-Modus ist standardmäßig false. Kehrt nach dem Senden zurück; fehlerhafte Syntax löst einen Lua-Fehler aus. Beide Plattformen unterstützen gewöhnliche Tastatur-/Texteingaben. Der Mac überspringt nicht unterstützte Tasten, Maus- und Rad-Aktionen und erzwingt seine Warteschlangen-/Textgrenzen. Er wartet auf seine Eingabewarteschlange im Hauptthread, die auch andere Folgen enthalten kann.

ms.keys("Hello", true)

ms.keys_down#

ms.keys_down(sequence: string) -> nil

Nur Windows: parst im Tastenmodus und drückt Tasten/Modifikatoren, ohne sie loszulassen. Wiederholungen werden in dieser Phase nicht wiederholt; Rad-Aktionen lösen einmal aus. Ungültige Syntax löst einen Lua-Fehler aus. Zum Loslassen mit keys_up kombinieren. Der Mac protokolliert die Funktion als nicht unterstützt und tut nichts. Kein Rückgabewert.

ms.keys_down("^a")
ms.sleep(50)
ms.keys_up("^a")

ms.keys_up#

ms.keys_up(sequence: string) -> nil

Nur Windows: löst die geparste Folge in umgekehrter Aktionsreihenfolge, mit den Modifikatoren zuletzt. Sleep-Schritte warten weiterhin. Syntaxfehler lösen einen Lua-Fehler aus. Der Mac protokolliert die Funktion als nicht unterstützt und tut nichts. Kein Rückgabewert.

ms.keys_down("{SHIFT}")
ms.keys_up("{SHIFT}")

ms.is_keys_pressed#

ms.is_keys_pressed(sequence: string) -> boolean | nil

Beide Plattformen prüfen jede Taste und ihre Präfix-Modifikatoren: "^a" erfordert Control und A. Jede Seite erfüllt ein Präfix; explizite Namen wie {RCTRL} erfordern genau diese Seite. Auf dem Mac ist ^ = Control, % = Option, + = Shift und # = Command. Mehrere Schritte bedeuten, dass alle aufgeführten Tasten/Modifikatoren gleichzeitig gedrückt sein müssen, nicht dass sie in dieser Reihenfolge gedrückt wurden; Wiederholungen fügen keine Anforderung hinzu. Maus-/Rad-, Sleep- oder Text-Aktionen machen die Prüfung falsch; eine leere Folge liefert true. Ungültige Syntax liefert false. Der Mac liest den kombinierten Sitzungszustand und liefert ohne Bedienungshilfen-Berechtigung false, mit einmaligem Protokolleintrag.

if ms.is_keys_pressed("^a") then
  ms.show_toast("Ctrl and A are down")
end

Zwischenablage und Dateien#

ms.get_clipboard_text#

ms.get_clipboard_text() -> string | nil

Keine Parameter. Liefert den Zwischenablagentext oder nil, wenn kein Text verfügbar ist. Auf beiden Plattformen unterstützt; die Markierung wird nicht automatisch abgerufen.

local text = ms.get_clipboard_text()
ms.log(text or "No text")

ms.set_clipboard_text#

ms.set_clipboard_text(text: string) -> nil

Ersetzt auf beiden Plattformen den Inhalt der Zwischenablage durch den Text; kein Rückgabewert und kein Erfolgszeichen. Andere Zwischenablagenformate bleiben nicht erhalten. Siehe Zwischenablagen-Rezepte.

ms.set_clipboard_text("Hello from Mousetroke")

ms.read_text#

ms.read_text(path: string) -> string | nil

Liest auf beiden Plattformen die gesamte Datei als UTF-8. Liefert nil bei einem Lese- oder UTF-8-Dekodierfehler. Relative Pfade verwenden das Arbeitsverzeichnis des Prozesses, nicht einen dokumentierten Skriptordner. Gelesene Daten zählen zum verfügbaren Speicher.

local text = ms.read_text("config.json")
ms.log(text and #text or 0)

Windows#

ms.find_win_by_class#

ms.find_win_by_class(pattern: string) -> table | nil

Durchsucht sichtbare Fenster der obersten Ebene mit einem Rust-regulären Ausdruck, unter Windows anhand von Klassennamen oder auf dem Mac anhand der Bundle-IDs der Anwendung (zum Beispiel ^com\\.apple\\.Safari$ in einer Lua-Zeichenkette). Liefert bis zu 32 Einträge in einem 1-basierten Array: {text=title, hwnd=window_id}; kein Treffer oder ein ungültiger Regex ergibt eine leere Tabelle. Die Groß-/Kleinschreibung wird beachtet, sofern das Muster nicht ein Flag wie (?i) verwendet; dies sind keine Lua-Muster. Der Mac liest Titel über Bedienungshilfen, liefert ohne Berechtigung nil und protokolliert einmal. Sein hwnd ist eine CGWindowID, die von focus_win und den Fensterzustands-APIs akzeptiert wird. Auf dem Mac werden nur aktuell sichtbare Fenster durchsucht.

local wins = ms.find_win_by_class("^Notepad$")
if wins and wins[1] then ms.focus_win(wins[1].hwnd) end

ms.find_win_by_title#

ms.find_win_by_title(pattern: string) -> table | nil

Durchsucht auf beiden Plattformen Fenstertitel mit einem Rust-regulären Ausdruck und liefert dieselben 1-basierten {text, hwnd}-Einträge wie find_win_by_class, höchstens 32. Ein ungültiger Regex ergibt eine leere Tabelle. Der Mac verwendet AX-Fenstertitel, benötigt die Bedienungshilfen-Berechtigung und durchsucht nur aktuell sichtbare Fenster.

local wins = ms.find_win_by_title("(?i)notepad")
if wins then ms.log(#wins) end

ms.focus_win#

ms.focus_win(wid: integer) -> nil

Aktiviert ein Fenster bzw. eine App; kein Rückgabewert und kein Erfolgszeichen. Windows nimmt ein HWND. Der Mac akzeptiert das Gestenziel oder eine entdeckte CGWindowID, stellt das Fenster wieder her, hebt das AX-Fenster an und aktiviert dann die besitzende App über die Hauptthread-Brücke. Mac-AX-Aufrufe laufen im Skript-Worker, verwenden die eingebaute Fenstersuche nach PID/Grenzen und benötigen die Bedienungshilfen-Berechtigung; veraltete IDs oder nicht verfügbare AX-Fenster werden ignoriert. Apps mit identischen, überlappenden Fenstergrenzen können mehrdeutig sein.

if wid ~= 0 then ms.focus_win(wid) end

ms.set_win_state#

ms.set_win_state(wid: integer, state: string) -> nil

Windows: "min" minimiert, "max" maximiert; jede andere Zeichenkette stellt wieder her, einschließlich "normal" und "norm". Mac: "min" verwendet AXMinimized; "max" stellt wieder her/verlässt den Vollbildmodus und drückt denselben AXZoomButton wie die integrierte Aktion, wenn das Fenster den Arbeitsbereich seines Bildschirms nicht füllt. "normal", "norm" und "restore" stellen wieder her/verlassen den Vollbildmodus und machen den Arbeitsbereich-Zoom rückgängig. Der Mac akzeptiert außerdem "fullscreen" über AXFullScreen, sofern die App es unterstützt; jeder andere Name wird ignoriert und einmal protokolliert. Die Groß-/Kleinschreibung wird unterschieden. Kein Rückgabewert. Der Mac benötigt die Bedienungshilfen-Berechtigung; AX läuft im Worker, und die Bildschirmgeometrie kommt über die Hauptthread-Brücke. Übergänge können asynchron sein.

Der Mac-Zoom ist appdefiniert: Ein Zoom auf Inhaltsgröße kann weiterhin "normal" melden und lässt sich mit dieser API nicht zuverlässig wiederherstellen; wiederholte "max"-Anforderungen können ihn umschalten. Verwenden Sie für solche Apps den integrierten Schalter Maximieren / Wiederherstellen. Es gibt kein öffentliches, universelles AX-Flag für den Zoomzustand.

if wid ~= 0 then ms.set_win_state(wid, "max") end

ms.get_win_state#

ms.get_win_state(wid: integer) -> string | nil

Windows liefert "min", "max" oder "normal". Dies ist keine Abfrage von „immer im Vordergrund“ und validiert kein veraltetes Handle; ein ungültiges Handle kann normal erscheinen. Der Mac liefert "min", "fullscreen", "max" (der Rahmen passt innerhalb von 2 logischen Punkten zum Arbeitsbereich eines Bildschirms) oder "normal". Der Mac hat keinen universellen öffentlichen AX-Getter für den Zoomzustand; Zoom auf Inhaltsgröße meldet daher normal. Die Funktion liefert nil bei fehlender Berechtigung, einem nicht verfügbaren AX-Fenster/-Zustand oder einer veralteten ID; eine verweigerte Berechtigung protokolliert einmal.

if wid ~= 0 then ms.log(ms.get_win_state(wid)) end

ms.set_win_top#

ms.set_win_top(wid: integer, top: boolean) -> nil

Windows setzt (true) oder löscht (false) „immer im Vordergrund“, ohne das Fenster zu verschieben oder in der Größe zu ändern; kein Rückgabewert. Dies setzt einen Zustand, schaltet ihn nicht um und liefert nicht den vorherigen Zustand. Der Mac tut nichts und protokolliert einmal: macOS hat keine öffentliche API, um Fenster anderer Apps anzuheften; auch die integrierte Aktion für „immer im Vordergrund“ wird nicht unterstützt. Für ein Umschalten wählen Sie im Windows-Editor Fensteraktionen → Immer im Vordergrund / aufheben.

if wid ~= 0 then ms.set_win_top(wid, true) end

Maus und Bildschirm#

ms.get_mouse_pos#

ms.get_mouse_pos() -> table

Keine Parameter. Beide Plattformen liefern {x=integer, y=integer} für die aktuelle Cursorposition, die vom Einstieg pos abweichen kann. Windows verwendet Bildschirmpixel; der Mac verwendet globale logische Quartz-Punkte, mit nach unten wachsendem Y. Der Mac liefert {x=0,y=0}, wenn die Cursorabfrage fehlschlägt.

local p = ms.get_mouse_pos()
ms.log("%d,%d", p.x, p.y)

ms.set_mouse_pos#

ms.set_mouse_pos(x: integer, y: integer) -> nil

Bewegt den Zeiger auf beiden Plattformen zu globalen Bildschirmkoordinaten; kein Rückgabewert. Koordinaten können negativ sein. Der Mac sendet ein markiertes Bewegungsereignis, damit dadurch keine weitere Geste startet.

local p = ms.get_mouse_pos()
ms.set_mouse_pos(p.x + 20, p.y)

ms.get_screen#

ms.get_screen(x: integer, y: integer) -> table | nil

Liefert das vollständige Bildschirmrechteck {left, top, right, bottom} als globale Ganzzahlkoordinaten, nicht den nutzbaren Arbeitsbereich. Die Breite ist right-left; die Höhe bottom-top. Windows wählt den nächsten Monitor, wenn der Punkt außerhalb aller Monitore liegt. Der Mac wählt das enthaltende Display oder fällt auf das erste zwischengespeicherte zurück; die Funktion kann nil liefern, wenn kein Bildschirm-/Brückenergebnis verfügbar ist. Beide Plattformen unterstützen diesen Aufruf.

local p = ms.get_mouse_pos()
local s = ms.get_screen(p.x, p.y)
if s then ms.log(s.right - s.left, s.bottom - s.top) end

ms.get_brightness#

ms.get_brightness(pos?: table) -> integer | nil

Das optionale {x=integer,y=integer} wählt den Bildschirm; weggelassen/nil oder eine unvollständige Position fällt auf den aktuellen Cursor zurück. Liefert bei Erfolg 0–100 Prozent, bei Fehler nil auf beiden Plattformen. Windows verwendet DDC/CI mit WMI-Fallback. WMI verwendet sein erstes Helligkeitsgerät, nicht einen zum Cursor passenden Monitor. Der Mac liefert derzeit nil und protokolliert einmal: sein bestehendes Helligkeits-Backend sendet nur Helligkeitstasten-Ereignisse des eingebauten Displays, mit denen sich kein Prozentsatz lesen lässt. Externes DDC wird nicht unterstützt. Nur der Windows-Legacy-Wrapper WG.GetBrightness behält -1 bei Fehler.

local value = ms.get_brightness()
if value ~= nil then ms.show_toast(tostring(value)) end

ms.set_brightness#

ms.set_brightness(pos: table | nil, delta: integer) -> integer | nil

Trotz des Namens stellt dies um delta Prozentpunkte ein; es setzt keinen absoluten Prozentsatz. Übergeben Sie eine benannte {x=...,y=...}-Tabelle oder nil als erstes Argument, um den Cursor zu verwenden. Erfolg liefert den neuen Prozentsatz von 0–100, begrenzt auf diesen Bereich; Fehler liefert nil auf beiden Plattformen. Windows verwendet dieselbe DDC/CI- und WMI-Auswahl wie get_brightness. Nur der Windows-Legacy-Wrapper WG.SetBrightness behält -1 bei Fehler. Der Mac liefert nil und protokolliert einmal: das bestehende Medien-und-System-Backend sendet nur Helligkeitstasten des eingebauten Displays, ohne numerisches Auslesen oder Kontrolle in Prozentpunkten. Durch diesen Lua-Aufruf wird keine Helligkeitsänderung vorgenommen; verwenden Sie für Helligkeitstasten jene integrierten Aktionen. Externes DDC bleibt nicht unterstützt.

local value = ms.set_brightness(nil, 5)
ms.log(value)

URLs und Prozesse#

ms.open#

ms.open(url: string) -> nil

Öffnet eine URL mit dem Standard-Handler; kein Rückgabewert und kein Erfolgszeichen. Windows verwendet shell open und akzeptiert auch einen Datei-/Ordnerpfad. Der Mac erwartet eine URL; verwenden Sie für eine Datei eine korrekt kodierte file://-URL oder ms.cmd, um /usr/bin/open auf einen Pfad anzuwenden. Es erfolgt keine Variablenersetzung.

ms.open("https://mousetroke.com/")

ms.run#

ms.run(file: string, args?: string) -> nil

Startet mit einer optionalen Argument-Zeichenkette, nicht einem Lua-Array; liefert keinen Wert und keine PID. Windows verwendet einen normalen Start ohne Rechteerhöhung mit RunAgain-Verhalten. Der Mac akzeptiert eine Bundle-ID, einen App-Pfad oder einen absoluten Pfad zu einer ausführbaren Datei; Argumente werden mit Anführungszeichenbehandlung getrennt. Der Start einer ausführbaren Datei kann auf einen Hintergrundprozess zurückfallen, wenn LaunchServices sie ablehnt. Er fordert eine neue Instanz an. Keine Variablenersetzung; verwenden Sie Lua-Konkatenation. Die Ausgabe des Prozesses wird nicht zurückgegeben.

if package.config:sub(1, 1) == "\\" then
  ms.run("cmd.exe", "/K echo Hello")
else
  ms.run("/usr/bin/say", '"Hello from Mousetroke"')
end

ms.cmd#

ms.cmd(command: string) -> nil

Führt Shell-Code über ein unsichtbares cmd.exe /C unter Windows oder /bin/zsh -c auf dem Mac aus. Liefert keinen Wert, keine Ausgabe und keinen Exit-Code und wartet nicht auf den Abschluss des Prozesses. Der Mac begrenzt gleichzeitig verwaltete Hintergrundprozesse auf 16 und protokolliert den Abschluss. Zeichenketten werden wie angegeben ausgeführt; %MS_*%-Platzhalter werden von dieser Lua-API nicht ersetzt. Zitieren Sie Shell-Argumente selbst.

if package.config:sub(1, 1) == "\\" then
  ms.cmd("taskmgr.exe")
else
  ms.cmd('/usr/bin/open -a "Activity Monitor"')
end

Weiter geht es mit Syntax für Tasten senden, Rezepten oder Protokollpfaden.

Mit einer Alltagsgeste beginnen

Laden Sie Mousetroke kostenlos herunter und richten Sie Ihre erste Geste ein. Für Windows und die Mac-Beta verfügbar.