![Korrigieren Sie die physische Position der Tastenkombinationen „Rückgängig“ (Strg-Z) und „Wiederholen“ (Strg-Y) zwischen deutschen und russischen Tastaturlayouts in Windows](https://rvso.com/image/1540070/Korrigieren%20Sie%20die%20physische%20Position%20der%20Tastenkombinationen%20%E2%80%9ER%C3%BCckg%C3%A4ngig%E2%80%9C%20(Strg-Z)%20und%20%E2%80%9EWiederholen%E2%80%9C%20(Strg-Y)%20zwischen%20deutschen%20und%20russischen%20Tastaturlayouts%20in%20Windows.png)
Ich ahme ein anderes Opfer des Tastaturlayout-Chaos nach, das unter einem ähnlichen, aber dennoch leicht anderen Problem leidet.
Ich verwende auf meiner Windows 10-Workstation häufig deutsche und russische Tastaturlayouts und wechsle häufig zwischen ihnen. Das Problem hängt damit zusammen, dass die Buchstaben Y und Z im deutschen Tastaturlayout im Vergleich zum standardmäßigen englischen QWERTY-Layout vertauscht sind.
Wenn ich das deutsche Layout verwende, ist die Tastenkombination „Rückgängig“ (Strg+Z) der Taste Z zugeordnet, die sich in der Mitte der ersten Buchstabenreihe zwischen T und U befindet. „Wiederholen“ (Strg+Y) ist der Taste Y zugeordnet, die sich im deutschen QWERTZ-Layout links neben X in der unteren Buchstabenreihe befindet.
Wenn Sie das Layout auf Russisch umstellen, passiert plötzlich etwas Schlimmes. Die Tastenkombinationen Rückgängig und Wiederherstellen tauschen gegenseitig ihre Position auf der Tastatur. Rückgängig (Strg-Z) befindet sich jetzt auf Y (untere Reihe, links neben X) und Wiederherstellen auf Z (obere Reihe, zwischen T und U). Diese Position ist identisch mit der Position von Strg-Z und Strg-Y auf dem standardmäßigen englischen Tastaturlayout.
Das bedeutet, dass die Position der Tastenkombinationen „Rückgängig“ und „Wiederholen“ immer dann in die entgegengesetzte Richtung wechselt, wenn ich das Tastaturlayout ändere. Wie Sie sich vorstellen können, drücke ich immer die falsche Tastenkombination, denn es ist unmöglich, zwei oszillierende, entgegengesetzte Muster zu lernen, zumindest protestiert mein Rückgrat. Da ich die Tastenkombinationen „Rückgängig“ und „Wiederholen“ sehr oft verwende, irritiert mich dieses Verhalten sehr.
Ich möchte die physische Position (Tasten) der Tastenkombinationen „Wiederholen“ und „Rückgängig“ in allen Windows-Anwendungen entweder auf ein deutsches oder besser noch auf ein englisches Layout festlegen.
Die dauerhafte Verwendung des englischen Layouts für alle Arten von lateinischen Texten behebt zwar das Problem mit den springenden Undo/Redo-Tastenkombinationen, ist für mich jedoch keine Option, da ich deutsche Texte mit allen Umlauten und ß eingeben muss (ich schlage kein internationales Layout für die Eingabe von Akzenten vor, da Deutsch meine Muttersprache ist und ich die Buchstaben in der Landessprache mit einem Tastendruck eingeben möchte).
Wie der Kollege in der referenzierten Frage bereits erwähnt hat, gibt es im Internet keine offensichtliche Antwort. Das gleiche Problem wird unter Ubuntu durch die Erstellung eines benutzerdefinierten Tastaturlayouts gelöst. Ich kann keine Informationen zum Erstellen eines benutzerdefinierten Layouts für Windows oder zum Patchen des aktuellen finden.
Dieses Verhalten ist bei allen mir bekannten Windows-Versionen gleich und hängt eng mit den ursprünglichen Tastaturlayout-Designs zusammen, die für Benutzer, die wie ich zufällig das deutsch-russische Sprachpaar verwenden, einfach inkompatibel sind.
Eine gute Lösung sollte direkt in Windows implementiert werden, ohne zusätzliche Software oder nur mit kostenloser Open-Source-Software. Funktionierende Lösungen mit AutoHotKey sind willkommen.
Mit der Hilfe von @miroxlav habe ich dieses halbwegs funktionierende AHK-Skript erstellt:
; Undo
$^z::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4070409) ; revert undo-redo hotkey mapping if in German layout
Send ^y
Else
Send ^н ; pass the keystroke through
Return
; Redo
$^y::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4070409) ; revert undo-redo hotkey mapping if in German layout
Send ^z
Else
Send ^я ; pass the keystroke through
Return
Dieses Skript ordnet Strg-Y <-> Strg-Z im deutschen Layout perfekt zu, beschädigt aber beide Hotkeys im russischen Layout. Ich verwende ^н und ^я in der Hoffnung, die Scancode-Äquivalente Strg-Y oder Strg-Z für das russische Layout zu emulieren, aber es funktioniert nicht (generiert н für Strg-Y und nichts Sichtbares für Strg-Z). Die Verwendung von ^z und ^y für Russisch funktioniert auch nicht und generiert die Buchstaben z bzw. y.
Anders als Miroxlavs Antwort musste ich einen Tastatur-Hook ($) verwenden, um Schleifen zu vermeiden und Beschriftungen zu entfernen (wahrscheinlich ein Kopier-/Einfügefehler).
Von Williams vorgeschlagene Lösung:
^SC02c::Send ^y
^SC015::Send ^z
funktioniert leider auch nicht. Es generiert einfache Buchstaben „y“ und „z“ im russischen Layout und keine Änderung im deutschen Layout (Strg-Z und Strg-Y wurden in der ursprünglichen Zuordnung durchgelassen).
Suche immer noch nach der Lösung.
Antwort1
Sie können ganz einfach Ihr eigenes Tastaturlayout erstellen mitMicrosoft Keyboard Layout Creator 1.4 vom offiziellen Microsoft Download Center.
Auf Youtube gibt es jede Menge Video-Tutorials zur Benutzung (wieDasmit russischem Gebietsschema) - suchen Sie einfach nach dem Namen. Aber im Grunde klonen Sie eines der vorhandenen Tastaturlayouts und ändern es entsprechend Ihren Anforderungen.
AutoHotKey-Lösung:
(Hinweis: Ersetzen Sie 0x4090409
die Konstante (US-Tastatur) durch den Wert, der für Ihr Layout gilt.)
$^z::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4090409)
Send ^z
Else
Send ^y
Return
$^y::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4090409)
Send ^y
Else
Send ^z
Return
Ein Hook ($) ist erforderlich, um eine Rekursion zu vermeiden Send ^z
oder Send ^y
einfach ein weiteres AHK-Makro aufzurufen.
Ich habe die Bedingung zur Tastaturerkennung getestet, sie hat gut funktioniert.
Natürlich kann man die Tastaturerkennung in eine Funktion integrieren und so den Code optimieren etc. Ich war aber zu faul dazu. :)
Antwort2
Ich habe endlich eine für mich funktionierende Lösung gefunden (AutoHotKey-Skript):
; Undo Ctrl-Z
^sc02C::
Send, ^{sc015}
Return
; Redo Ctrl-Y
^sc015::
Send, ^{sc02C}
Return
Es behält die Rückgängig-Taste (Strg-Z) perfekt an ihrem logischen Platz – untere linke Reihe – unabhängig vom Tastaturlayout.
Vielen Dank an @Miroxlav und @Williams für die Lösungsvorschläge.
Antwort3
Basierend auf Antons Antwort habe ich den Code auf AHK v2 aktualisiert und Unterstützung für die Strg+Umschalt-Variante hinzugefügt, da viele Programme diese jetzt für Wiederherstellen verwenden.
#Requires AutoHotkey v2.0
;Remapping upper mid Y/Z key (Y in EN layout)
^sc015::Send "^{sc02C}"
^+sc015::Send "^+{sc02C}"
;Remapping lower left Y/Z key (Z in EN layout)
^sc02C::Send "^{sc015}"
^+sc02C::Send "^+{sc015}"
Der Zweck dieses Skripts besteht darin, die Rückgängig-Aktion auf die untere linke Y/Z-Taste zu fixieren, da unterschiedliche Layouts (QWERTZ vs. QWERTY) das Z in die obere Mitte verschieben, was unpraktisch ist. Dasselbe gilt für „Wiederholen“, das jetzt auf die obere mittlere Y/Z-Taste fixiert ist.
Da Rückgängig/Wiederholen normalerweise mit Strg+Z/Y ausgeführt wird, kann dies erreicht werden, indem die gedrückte Taste erfasst und die „richtige“ Taste erneut gesendet wird. Das sind die ^sc0**
Zeilen. Die ^+sc0**
Zeilen dienen zum erneuten Senden von Strg+Umschalt+Z/Y-Ereignissen, da viele Programme Strg+Umschalt+Z für Wiederherstellen verwenden.
Die „richtige“ Taste steht in Anführungszeichen, denn wenn man sich das Skript ansieht, müsste es eigentlich nur überall Strg(+Umschalt)+Y/Z umdrehen … und damit nichts bewirken. Das passiert jedoch nicht und es funktioniert einfach … obwohl ich und meines Wissens der ursprüngliche Autor nicht wissen, warum.
Wenn Sie wissen, warum das bei Ihnen funktioniert oder nicht, dann sagen Sie es.
Antwort4
Obwohl die akzeptierte Antwort funktioniert, funktioniert sie nur, wenn das zu diesem Zeitpunkt ausgewählte Layout das deutsche Layout war, andernfalls wird die Rückgängig-Funktion in allen anderen Layouts deaktiviert.
Um dieses Problem zu lösen, müssen Sie lediglich den US-Code 0x4090409
durch den deutschen Code ersetzen 0x4070407
. Außerdem müssen Sie die if-Anweisung wie folgt ändern:
$^z::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4070407)
Send ^y
Else
Send ^z
Return
$^y::
hWnd := WinExist("A")
ThreadID := DllCall("GetWindowThreadProcessId", "UInt", hWnd, "UInt", 0)
hKL := DllCall("GetKeyboardLayout", "UInt", ThreadID, "UInt")
If (hKL = 0x4070407)
Send ^z
Else
Send ^y
Return