Correção da localização física dos atalhos Desfazer (Ctrl-Z) e Refazer (Ctrl-Y) entre os layouts de teclado alemão e russo no Windows

2

Estou imitando outra vítima do caos do layout do teclado, que sofre de um problema semelhante, embora ligeiramente diferente.

Estou usando layouts de teclado alemão e russo extensivamente na minha estação de trabalho do Windows 10 e alterno frequentemente entre eles. O problema está relacionado ao fato de que as letras Y e Z são trocadas no layout de teclado alemão, em comparação com o layout padrão QWERTY em inglês.

Se eu usar o layout alemão, o atalho Desfazer (Ctrl-Z) será vinculado à tecla Z, que está localizada no meio da primeira linha da letra entre T e U. O Refazer (Ctrl-Y) é vinculado a a tecla Y, que está localizada à esquerda para X na linha baixa de letras no layout alemão QWERTZ.

Se você mudar o layout para o russo, de repente uma coisa maligna está acontecendo. Os atalhos Desfazer e Refazer mudam mutuamente sua posição no teclado. Desfazer (Ctrl-Z) está localizado agora em Y (linha inferior, esquerda para X) e Refazer em Z (linha superior, entre T e U). Esta é a localização idêntica à localização de Ctrl-Z e Ctrl-Y no layout de teclado padrão em inglês.

Isso significa que o local dos atalhos Desfazer e Refazer está mudando para o oposto todo o tempo em que alterno o layout do teclado. Como você pode imaginar, eu estou sempre pressionando o atalho errado, porque é impossível aprender dois padrões opostos oscilantes, pelo menos meus protestos cerebrais da coluna. Como eu uso os atalhos Desfazer e Refazer com muita frequência, esse comportamento me irrita muito.

Desejo corrigir a localização física (chaves) dos atalhos Redo e Desfazer em todo o conjunto de aplicativos do Windows para alemão ou melhor layout de inglês.

Usar o layout em inglês permanentemente para todos os tipos de textos em latim, embora corrija o problema de saltar atalhos de Desfazer / Refazer, mas não é uma opção para mim, porque preciso digitar textos em alemão com todos os trema e ß (não sugiro um layout internacional para inserir acentos, porque o alemão é meu idioma principal e quero digitar suas letras nativas com um toque de tecla).

Como o colega na questão referenciada já mencionada, não há resposta óbvia na Internet. O mesmo problema é resolvido no Ubuntu, criando um layout de teclado personalizado. Não consigo encontrar informações sobre como criar layout personalizado para o Windows ou corrigir o atual.

Esse comportamento é consistente entre todas as versões do Windows que eu conheço e relacionado profundamente nos designs iniciais de layout de teclado, que são incompatíveis apenas para usuários que usam par de idiomas russo-alemão como eu.

Uma boa solução deve ser implementada no Windows diretamente, sem qualquer software adicional ou apenas software livre de código aberto. Soluções de trabalho envolvendo o AutoHotKey são bem-vindas.

Com a ajuda de @miroxlav, criei este script AHK semi-funcional:

; 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

Este script remapeia perfeitamente Ctrl-Y < - > Ctrl-Z no layout alemão, mas corrompe as duas teclas de atalho no layout russo. Eu uso ^ н e ^ я com a esperança de emular os equivalentes Ctrl-Y ou Ctrl-Z para o layout russo, mas isso não funciona (gera ½ para Ctrl-Y e nada visível para Ctrl-Z). Usar ^ z e ^ y para russo também não funciona, gerando as letras z e y, respectivamente.

Diferente da resposta do Miroxlav eu tive que usar o gancho de teclado ($) para evitar o loop e remover etiquetas (provavelmente copiar erro de colar)

Solução sugerida por Williams:

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

infelizmente não funciona também. Ele gera letras simples 'y' e 'z' no layout russo e nenhuma alteração no layout alemão (Ctrl-Z e Ctrl-Y passados no mapeamento original).

Ainda procurando a solução.

    
por Anton Golubev 01.09.2017 / 21:35

2 respostas

0

Encontrei finalmente uma solução funcional para mim (script AutoHotKey):

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

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

Mantém perfeitamente a chave de desfazer (Ctrl-Z) em seu lugar lógico - linha inferior esquerda - independentemente do layout do teclado.

Obrigado @Miroxlav e @Williams por trazerem peças para a solução.

    
por 04.09.2017 / 22:31
1

Você pode simplesmente criar seu próprio layout de teclado usando o Microsoft Keyboard Layout Creator 1.4 do Microsoft oficial Centro de downloads .

O YouTube oferece vários tutoriais em vídeo sobre como usá-lo (como este com o idioma russo) - Basta procurar por seu nome. Mas, basicamente, você clona um dos layouts de teclado existentes e os modifica de acordo com suas necessidades.

Solução AutoHotKey:

(nota: substitua 0x4090409 constant (teclado dos EUA) pelo valor que se aplica ao seu layout)

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

O gancho ($) é necessário para evitar a recursão, ou seja, Send ^z ou Send ^y invocando apenas outra macro AHK.

Eu testei essa condição de detecção de teclado, funcionou muito bem.

Claro, você pode colocar a detecção do teclado em função e, portanto, otimizar o código, etc. Eu estava com preguiça de fazer isso. :)

    
por 01.09.2017 / 22:19