Zeit für den üblichen Tastatur-Frühjahrsputz :-) Akku-Bläser für die Zwischenräume erspart das Abnehmen der Kappen. Dazu diese Haftknete. Passt.

Meine mechanische Razer BlackWidow hat nun ca. 10 Jahre auf dem Buckel.

Früher war ein kleines Luxusproblem, dass häufig genutzte Tasten etwas abgenutzt erschienen. Okay, das hat eigentlich nur mich interessiert :-) Aber wenn mal kurz erschrecken möchte: Smartphone-Aufnahme der eigenen Tastatur mit hoher Auflösung vor der Reinigung ...

#tastatur

Gerade per Mail rein bekommen. Swiftkey hatte ich früher genutzt und bin aus guten Grund schon lange weg. Nein Ich möchte meine Daten nicht in #OneDrive gespeichert haben. Von mir aus können sie mein damaliges Konto löschen.

#Microsoft #Swiftkey #Tastatur #Android

2 Zusatzbildschirme macht Probleme › Grafik, Tastatur und Maus › Grafische Oberfläche › Forum › ubuntuusers.de

Nvidia-Treier und Intel-Treiber gleichzeitig? › Grafik, Tastatur und Maus › Grafische Oberfläche › Forum › ubuntuusers.de

Ich möchte mir eine neue Office #Tastatur zulegen, seit Jahren nutze ich eine - mittlerweile - alte Cherry. Was empfiehlt ihr? #keyboard KI Symbolbild
Anzeige einrichten (Hintergrundbild etc.) geht nicht mehr › Grafik, Tastatur und Maus › Grafische Oberfläche › Forum › ubuntuusers.de

#SwiftKey verlangt ab Ende Mai 2026 ein #Microsoft-#Konto - Anmeldung über Apple- und Google-Konten wird dann nicht mehr möglich sein. Die Userdaten ziehen zu #OneDrive um. #Keyboard #Tastatur #App https://winfuture.de/news,157569.html?utm_source=Mastodon&utm_medium=ManualStatus&utm_campaign=SocialMedia
SwiftKey für Android & iOS: Anmeldung mit Microsoft-Konto bald Pflicht

Wer das alternative Software-Keyboard SwiftKey unter Android oder iOS nutzt, muss sich künftig mit einem Microsoft-Konto anmelden. Die bei der Verwendung von SwiftKey anfallenden Daten eines Nutzers werden zudem bei Microsoft OneDrive hinterlegt.

WinFuture.de
Proprietären Treiber für GTX650 installieren › Grafik, Tastatur und Maus › Grafische Oberfläche › Forum › ubuntuusers.de

Zweiter Monitor wird nicht erkannt nach Neuinstallation › Grafik, Tastatur und Maus › Grafische Oberfläche › Forum › ubuntuusers.de

AutoHotKey-Hacks

AutoHotkey (AHK), kennste, kennste? Das ist ein – jedenfalls unter Windows – sehr mächtiges Open Source-Tool, wenn es um das Nutzen von eigenen Tastenkombinationen, das Automatisieren von Vorgängen oder Mausaktionen geht. Eine eierlegende Wollmilchsau.

Allerdings finde ich die Nutzung schon immer etwas holprig. AutoHotkey ist skriptbasiert, das muss man mögen und können. Wobei die Sache mit dem Können in Zeiten mächtiger LLMs schon an Schrecken verloren hat. Wenn man eine Idee hat, die man damit umsetzen will, dann bekommt man das mittlerweile auch gelöst. Zudem ist seit Version 2 alles etwas glatter und konsistenter geworden.

Wenn man eine Idee hat… Daher will ich hier mal kurz zeigen, was ich mit AutoHotkey so mache, vielleicht inspiriert es ja den einen oder die andere. Was ich hier nicht zeige ist den Einstieg in die Nutzung von AutoHotkey, denn Youtube ist voll von solchen Tutorials, da wirst du fündig. Und wild ist das nicht.

Bsp. 1: Der Klassiker: Öffnen eines Programms

Ich verwende als Passwortmanager Keepass XC, und den brauche ich ständig. Ich will also eine sehr einfache Möglichkeit haben, Keepass XC zu öffnen und den Fokus direkt auf das Suchfeld zu legen. Für die Verwendung von Passwörtern im Browser ist das nicht nötig, da ist Keepass XC bestens integriert, aber für alle andere Dinge schon.

Was ich also will: Mit “Strg + Alt + K” (K wie Keepass) soll Keepass XC ggf. gestartet, auf jeden Fall geöffnet und der Fokus auf das Suchfeld gesetzt werden. Gelöst habe ich das so:

; Welches Fenster soll gesucht werden? (Prozessnamen statt Fenstertitel, sonst Probleme, wenn z.B. "KeePassXC" in einem VS Code Tab steht). targetTitle := "ahk_exe KeePassXC.exe" ; --- Haupt-Hotkey: Strg + Alt + K --- ^!k:: { ; Fall 1: Das Fenster ist bereits im Vordergrund -> Minimieren if WinActive(targetTitle) { WinMinimize } else { ; Fall 2: Das Programm läuft noch gar nicht -> Starten if !WinExist(targetTitle) { try { Run("C:\Program Files\KeePassXC\KeePassXC.exe") ; Warte max. 10 Sek., bis das Fenster vom System registriert wird if !WinWait(targetTitle, , 10) { MsgBox("KeePassXC startete zu langsam.", "Zeitüberschreitung", "IconHand") return } } catch { MsgBox("Die Datei 'KeePassXC.exe' wurde unter dem Pfad nicht gefunden.", "Fehler", "IconHand") return } } ; Fall 3: Programm läuft im Hintergrund -> Aktivieren und Fokus setzen WinActivate(targetTitle) ; Warte kurz, bis das Fenster wirklich den Fokus hat, bevor wir Tippen if WinWaitActive(targetTitle, , 2) { Send("^f") ; Sendet Strg+F für die Suche } } }

Das ist zwar etwas umfangreicher als nötig, hat dafür aber schon diverses Error-Handling mit drin. Mit diesem Code bin ich seit Jahren mehr als glücklich und verwende den mehrfach täglich.

Bsp. 2: Tastaturlayout (bei Laptops) anpassen

Seit einigen Jahren arbeite mit einem Laptop, bei dem mir das Standard-Tastaturlayout nicht gefällt. Und zwar hat er physische “Page Up”- und “Page Down”-Tasten, die von mir dagegen häufig verwendeten Tasten “Home” / “Pos1” und “End” sind nur über den Umweg der Function-Taste erreichbar. Das nervt, ist aber ein ganz klassisches Anwendungsszenario für AutoHotkey.

Mit diesem Code macht man aus der Eingabe von “Page Up” ein “Pos1” usw.:

; Tasten direkt vertauschen: PgUp::Home ; Drücke ich PgUp, wird stattdessen Home gesendet PgDn::End ; Drücke ich PgDn, wird stattdessen End gesendet Home::PgUp ; Drücke ich Home, wird stattdessen PgUp gesendet End::PgDn ; Drücke ich End, wird stattdessen PgDn gesendet ; Dasselbe für die Kombination mit Shift: +PgUp::+Home ; Shift+PgUp verhält sich wie Shift+Home +PgDn::+End ; Shift+PgDn verhält sich wie Shift+End +Home::+PgUp ; Shift+Home verhält sich wie Shift+PgUp +End::+PgDn ; Shift+End verhält sich wie Shift+PgDn ; In AutoHotkey bedeutet: ; + = Shift, ^ = Strg, ! = Alt, # = Win

Das löst das Problem mit dem “falschen” Tastenlayout problemlos.

Bsp. 2 : Tastaturlayout (bei Laptops) anpassen (extended version)

Aber: Der obige Code soll natürlich nur dann laufen, wenn ich auch direkt an dieser Laptop-Tastatur sitze. Die meiste Zeit arbeite ich mit einer externen Tastatur, d.h. da wäre dieser Tasten-Tausch hinderlich. Es wäre gut, das Skript würde nun erkennen, an welcher Tastatur ich sitze.

Gelöst habe ich das dadurch, dass ich eine Tastenkombination definiert habe, die das Script selbst neu läd. Beim Laden wird dann geschaut, ob meine externe Tastatur erkannt wird oder nicht, und abhängig davon wird das obige Tasten-Remapping gemacht oder eben nicht.

Ich will darauf gar nicht im Detail eingehen, sondern zeige den Code vor allem deshalb, um die Mächtigkeit von AutoHotkey zu demonstrieren:

; --- Konfiguration --- MyExternalKeyboardId := "b35b_REV" global ExternalKeyboardBool := false ; --- Initialisierung --- try { o := HidListObj() ; Checken, ob ein Keyboard-Name den String enthält for keyboard in o.Keyboard { if InStr(keyboard.Name, MyExternalKeyboardId) { global ExternalKeyboardBool := true break } } } catch { MsgBox("Fehler beim Auslesen der Hardware-Liste.", "Fehler", 16) } ; --- Benutzerbestätigung --- MsgTitle := "AutoHotkey gestartet" MsgText := ExternalKeyboardBool ? "Externes Keyboard gefunden!`n`nPasst das?" : "KEIN externes Keyboard gefunden...`n`nPasst das?" Result := MsgBox(MsgText, MsgTitle, 32 + 4) ; Icon Frage + Ja/No if (Result = "No") { global ExternalKeyboardBool := !ExternalKeyboardBool MsgBox("OK, Einstellung geändert...", "Keyboard geändert", "Iconi T1") } ; --- Hotkeys --- ; Skript neu laden ^!r:: Reload() ; Die Direktive #HotIf sorgt dafür, dass die Hotkeys NUR dann aktiv sind, ; wenn die Bedingung (KEIN externes Keyboard) erfüllt ist. ; Das spart die manuellen Checks in jedem Hotkey. #HotIf !ExternalKeyboardBool PgUp::Home PgDn::End Home::PgUp End::PgDn +PgUp::+Home +PgDn::+End +Home::+PgUp +End::+PgDn ; Backspace Fix für defekte Taste $BackSpace:: { Send("{BackSpace Down}") Sleep(70) Send("{BackSpace Up}") } ; Globaler Ersatz für Backspace PrintScreen::BackSpace #HotIf /************************************************************************ * FUNKTIONEN ************************************************************************/ /** * Erstellt ein Objekt mit allen HID-Geräten * Basiert auf: https://www.autohotkey.com/boards/viewtopic.php?p=58347#p58347 */ HidListObj() { F := { Mouse: [], Keyboard: [], HID: [] } B := Map(0, "Mouse", 1, "Keyboard", 2, "HID") iCount := 0 ; Erste Abfrage für die Anzahl der Geräte DllCall("GetRawInputDeviceList", "Ptr", 0, "UInt*", &iCount, "UInt", A_PtrSize * 2) if (iCount = 0) return F uHIDList := Buffer(iCount * (A_PtrSize * 2)) DllCall("GetRawInputDeviceList", "Ptr", uHIDList, "UInt*", &iCount, "UInt", A_PtrSize * 2) loop iCount { offset := (A_Index - 1) * (A_PtrSize * 2) hDevice := NumGet(uHIDList, offset, "Ptr") Type := NumGet(uHIDList, offset + A_PtrSize, "UInt") TypeName := B.Has(Type) ? B[Type] : "HID" deviceInfo := {} deviceInfo.Handle := hDevice ; Gerätename abrufen iLength := 0 DllCall("GetRawInputDeviceInfo", "Ptr", hDevice, "UInt", 0x20000007, "Ptr", 0, "UInt*", &iLength) if (iLength > 0) { nameBuf := Buffer((iLength + 1) * 2) DllCall("GetRawInputDeviceInfo", "Ptr", hDevice, "UInt", 0x20000007, "Ptr", nameBuf, "UInt*", &iLength) deviceInfo.Name := StrGet(nameBuf) } ; Geräteinfo abrufen iLength := 0 DllCall("GetRawInputDeviceInfo", "Ptr", hDevice, "UInt", 0x2000000b, "Ptr", 0, "UInt*", &iLength) if (iLength > 0) { uInfo := Buffer(iLength) NumPut("UInt", iLength, uInfo) DllCall("GetRawInputDeviceInfo", "Ptr", hDevice, "UInt", 0x2000000b, "Ptr", uInfo, "UInt*", &iLength) if (Type = 0) { ; Mouse deviceInfo.ID := NumGet(uInfo, 8, "UInt") deviceInfo.Buttons := NumGet(uInfo, 12, "UInt") } else if (Type = 1) { ; Keyboard deviceInfo.KBType := NumGet(uInfo, 8, "UInt") deviceInfo.KeysTotal := NumGet(uInfo, 28, "UInt") } else if (Type = 2) { ; HID deviceInfo.VendorID := NumGet(uInfo, 8, "UInt") deviceInfo.ProductID := NumGet(uInfo, 12, "UInt") } } F.%TypeName%.Push(deviceInfo) } return F }

Bsp. 3: Defekte Taste “reparieren”

Im Lauf der Jahre hat die Backspace-Taste meiner Laptop-Tastatur etwas gelitten. Sie hat angefangen, nicht nur ein einziges Zeichen zu löschen, wenn man sie drückt, sondern sie hat mehrfach ausgelöst. Durch ein “Debouncing” hat sich das leicht reparieren lassen:

; Backspace Fix für defekte Taste: $BackSpace:: { Send("{BackSpace Down}") Sleep(70) Send("{BackSpace Up}") }

Was hier passiert: Beim Drücken der Backspace-Taste wird zunächst das Herunterdrücken der Taste gesendet, dann wird für 70ms gewartet, und danach wird das Loslassen der Taste gesendet. Das hat geholfen, um das Problem zu beheben. Definitiv günstiger als eine neue Tastatur.

Eine Alternative wäre, einfach statt der Backspace-Taste eine andere Taste zu verwenden, z.B. die “Druck”- bzw. “Print”-Taste, die bei meinem Laptop praktischerweise direkt darüber liegt:

PrintScreen::BackSpace

Bsp. 4: Steuern von Heimautomation

Wenn du Dinge in deinem Zuhause automatisiert hast und dafür z.B. MQTT nutzt, dann könnte so etwas interessant sein. Du installierst dir lokal Mosquitto und kannst dann ganz einfach per AutoHotkey und Tastenkombinationen bestimmte Aktionen auslösen. Das könnte z.B. so aussehen, um eine Lampe ein- und auszuschalten:

^!l:: ; Strg+Alt+L { RunWait '"C:\Tools\mosquitto\mosquitto_pub.exe"' . ' -h 192.168.1.10' . ' -p 1883' . ' -u "deinUser"' . ' -P "deinPasswort"' . ' -t "home/schreibtisch/licht"' . ' -m "TOGGLE"' , , "Hide" }

Bsp. 4: AutoHotkey selbst automatisieren

Bei mir sind die AutoHotkey-Sachen in zwei Skripte aufgeteilt. Jedes davon muss beim Systemstart gestartet werden. Das macht AutoHotkey nicht von sich aus, man muss da selbst eine Autostart-Verknüpfung anlegen. Das meinte ich oben damit, dass die Benutzung etwas holprig ist.

Wenn man diesen Code oben in jedes Skript packt spart man sich das. Denn der Code erzeugt automatisch einen Autostart-Link zu dem jeweiligen Skript, wenn noch keiner vorhanden ist:

; --- Autostart-Verknüpfung erstellen --- ; Erstellt automatisch eine Verknüpfung im Autostart-Ordner für das aktuelle Skript A_StartupShortcut := A_Startup "\" StrReplace(A_ScriptName, ".ahk", ".lnk") if !FileExist(A_StartupShortcut) { FileCreateShortcut(A_ScriptFullPath, A_StartupShortcut) MsgBox("Autostart-Verknüpfung für " A_ScriptName " wurde erstellt!", "Autostart", "Iconi") }

So, das waren ein paar Anwendungsideen für AutoHotkey von mir. Vielleicht inspiriert es dich ja, auch bei dir ein paar Arbeitsabläufe eleganter zu lösen und auf dem Weg dahin noch ein bisschen Spaß beim Basteln mit Code zu haben.

#Automation #Code #Tastatur #Windows