2009-07-22 7 views
0

J'ai implémenté un hook de bas niveau à l'aide de la fonction SetWindowsHookEx(). Cela fonctionne bien et renvoie un code de clé virtuelle pour chaque frappe. Je peux convertir ce code de clé virtuelle en System.Windows.Input.Key en utilisant KeyInterop.KeyFromVirtualKey(). Mais la cible est d'obtenir un symbole correspondant à ce code de clé virtuelle dans la disposition de clavier actuelle.Entrée de clavier d'interception utilisant la disposition de clavier actuelle

I.e. Pour la mise en page en allemand, je veux obtenir "Y" pour Key.Z, "Z" pour Key.Y.

Est-ce que quelqu'un peut vous aider?

Merci.

Répondre

0

Appelez le GetKeyboardLayout pour récupérer la valeur de mise en page active, puis effectuez une boucle conditionnelle pour obtenir le résultat souhaité.

0

Vous devriez jeter un oeil à ces méthodes GetKeyboardState, GetKeyboardLayout, MapVirtualKeyEx, ToUnicodeEx.

Solution devrait ressembler à quelque chose comme

byte[] keyboardState = new byte[256]; 
GetKeyboardState(keyboardState); 
IntPtr handle = GetKeyboardLayout(0); 
uint scanCode = MapVirtualKeyEx(VirtualKeyCode, 0, handle); 
StringBuilder stringBuilder = new StringBuilder(2); 

int nResultLower = ToUnicodeEx(VirtualKeyCode, scanCode, keyboardState, stringBuilder, 
             stringBuilder.Capacity, 0, handle); 

string output= string.Empty; 
if (nResultLower != 0) 
{ 
    output = stringBuilder.ToString(); 
} 
0

Pas tout à fait sûr que nous parlons même scénario, mais j'ai récemment rencontré le même problème où ToUnicodeEx interrompu de frappes (lors de l'utilisation des modificateurs comme « utilisateurs alt + numpad » ou sur le clavier allemand le modificateur de touche '+'), ce qui provoque l'impression de lettres inattendues dans l'écran à la place des lettres désirées.

résolu mon problème en combinant @ code de Nejchy avec la méthode ClearKeyboardBuffer droit avant d'exécuter ToUnicodeEx:

private static bool ClearKeyboardBuffer(uint vk, uint sc, IntPtr hkl) 
{ 
    StringBuilder sb = new StringBuilder(10); 
    int rc = -1; 
    bool isDeadKey = false; 
    while (rc < 0) 
    { 
     rc = user32.ToUnicodeEx(vk, sc, new byte[256], sb, sb.Capacity, 0, hkl); 
     if (!isDeadKey && rc == -1) isDeadKey = true; 
     Console.Write(rc); 
    } 
    return isDeadKey; 
} 

Dans votre code qui 'ToUnicodeEx':

var isDeadKey = ClearKeyboardBuffer((uint)aKey, 0, hKd); 
if (isDeadKey) return; 
user32.ToUnicodeEx((uint)aKey, vkCode, keyboardState, characters, 10, (uint)0, hKd); 

Référence: http://www.siao2.com/2006/03/23/558658.aspx http://www.siao2.com/2006/04/06/569632.aspx

Regardez également son code: https://stackoverflow.com/a/8705696/802848

Questions connexes