2

Я подражаю другой жертве хаоса раскладки клавиатуры, которая страдает от аналогичной, но немного другой проблемы.

Я часто использую немецкую и русскую раскладки клавиатуры на своей рабочей станции Windows 10 и часто переключаюсь между ними. Проблема связана с тем, что буквы Y и Z переключаются в немецкой раскладке клавиатуры по сравнению со стандартной английской раскладкой QWERTY.

Если я использую немецкую раскладку, ярлык отмены (Ctrl-Z) привязывается к клавише Z, которая находится в середине первой строки букв между T и U. Повтор (Ctrl-Y) привязывается к клавише Y , который расположен слева от X в нижнем ряду букв на немецкой раскладке QWERTZ.

Если вы переключите раскладку на русский, вдруг случится что-то плохое. Сочетания клавиш «Отменить» и «Повторить» взаимно меняют положение на клавиатуре. Отменить (Ctrl-Z) теперь находится в Y (нижний ряд, слева от X) и Отменить в Z (верхний ряд, между T и U). Это местоположение идентично расположению Ctrl-Z и Ctrl-Y на стандартной английской раскладке клавиатуры.

Это означает, что расположение ярлыков «Отменить» и «Повторить» меняется на противоположное все время, пока я переключаю раскладку клавиатуры. Как вы можете себе представить, я всегда нажимаю не на тот ярлык, потому что невозможно выучить два колебательных противоположных паттерна, по крайней мере, мой протест позвоночника. Поскольку я очень часто использую ярлыки «Отменить» и «Повторить», такое поведение меня сильно раздражает.

Я хочу исправить физическое расположение (ключи) ярлыков «Вернуть» и «Отменить» во всем наборе приложений Windows либо на немецком, либо на английском языке.

Постоянное использование английской раскладки для всех видов латинских текстов, хотя и устраняет проблему с переходом по ярлыкам «Отменить / Повторить», но для меня это не вариант, потому что мне нужно набирать немецкие тексты со всеми умлаутами и ß (не предлагать международную разметку для введите акценты, потому что немецкий является моим основным языком, и я хочу набирать его родные буквы одним нажатием клавиши).

Как уже упоминал коллега в упомянутом вопросе, в Интернете нет очевидного ответа. Та же проблема решается в Ubuntu путем создания настраиваемой раскладки клавиатуры. Я не могу найти информацию о создании собственного макета для Windows или исправлении текущего.

Такое поведение одинаково для всех известных мне версий Windows и тесно связано с первоначальной конструкцией раскладки клавиатуры, которая просто несовместима для пользователей, использующих немецко-русскую языковую пару, как я.

Хорошее решение должно быть реализовано в Windows напрямую без какого-либо дополнительного программного обеспечения или только бесплатного программного обеспечения с открытым исходным кодом. Рабочие решения с участием AutoHotKey приветствуются.

С помощью @miroxlav я придумал этот полуработающий скрипт AHK:

; 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

Этот скрипт отлично переназначает Ctrl-Y <-> Ctrl-Z в немецкой раскладке, но повреждает обе горячие клавиши в русской раскладке. Я использую ^ н и ^ я с надеждой эмулировать эквиваленты скан-кода Ctrl-Y или Ctrl-Z для русской раскладки, но это не работает (генерирует н для Ctrl-Y и ничего не видно для Ctrl-Z). Использование ^ z и ^ y для русского также не работает, генерируя буквы z и y соответственно.

В отличие от ответа Miroxlav мне пришлось использовать хук клавиатуры ($), чтобы избежать зацикливания и удаления меток (возможно, ошибка копирования и вставки)

Решение, предложенное Уильямсом:

^SC02c::Send ^y
^SC015::Send ^z

к сожалению тоже не работает. Он генерирует простые буквы 'y' и 'z' в русской раскладке и без изменений в немецкой раскладке (Ctrl-Z и Ctrl-Y пропущены в исходном отображении).

Все еще ищу решение.

2 ответа2

1

Вы можете просто создать свою собственную раскладку клавиатуры с помощью Microsoft Keyboard Layout Creator 1.4 из Официального центра загрузки Microsoft.

Youtube предоставляет множество видеоуроков , как использовать его (как это с русской локалью) - просто искать его имя. Но в основном вы клонируете одну из существующих раскладок клавиатуры и модифицируете ее в соответствии со своими потребностями.

Решение AutoHotKey:

(примечание: замените константу 0x4090409 (клавиатура США) значением, которое применяется к вашему макету)

$^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

Hook ($) необходим, чтобы избежать рекурсии, то есть Send ^z или Send ^y вызывающий только другой макрос AHK.

Я проверил это условие обнаружения клавиатуры, оно работало хорошо.

Конечно, вы можете включить функцию обнаружения клавиатуры и оптимизировать код и т.д. Мне было лень это делать. :)

0

Я наконец нашел рабочее решение для меня (скрипт AutoHotKey):

; Undo Ctrl-Z
^sc02C::
    Send, ^{sc015}
Return

; Redo Ctrl-Y
^sc015::
    Send, ^{sc02C}
Return

Он отлично удерживает клавишу отмены (Ctrl-Z) на своем логическом месте - в левом нижнем ряду - независимо от раскладки клавиатуры.

Спасибо @Miroxlav и @Williams за то, что принесли кусочки для решения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .