2009-07-22 6 views
0

SetWindowsHookEx()関数を使用して低レベルのキーボードフックを実装しました。それは正常に動作し、各キーストロークの仮想キーコードを返します。 KeyInterop.KeyFromVirtualKey()を使用して、この仮想キーコードをSystem.Windows.Input.Keyに変換できます。しかし、目標は現在のキーボードレイアウトでこの仮想キーコードに対応するシンボルを取得することです。現在のキーボードレイアウトを使用してキーボード入力を傍受する

I.e.ドイツ語のレイアウトでは、Key.Zに "Y"、Key.Yに "Z"を取得したいと思います。

誰でも助けることができますか?

ありがとうございます。

答えて

0

アクティブなレイアウト値を取得するためにGetKeyboardLayoutを呼び出してから、条件ループを実行して必要な結果を取得します。

0

GetKeyboardStateGetKeyboardLayoutMapVirtualKeyExToUnicodeExをご覧ください。

ソリューションは

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

我々は同じシナリオの話をしている、非常にわからないようになっているはずですが、ALT +テンキーの 『のような修飾子を使用するときのキーストローク(』私は最近ToUnicodeExユーザーを中断し、同様の問題に遭遇しましたまたはドイツ語キーボードの '+'キー修飾子)、希望の文字が表示された場合は、代わりに予期しない文字が画面に表示されます。

は右ToUnicodeExを実行する前に、ClearKeyboardBuffer方法とNejchyのコード@組み合わせることによって、私の問題を解決:

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

参考: http://www.siao2.com/2006/03/23/558658.aspx http://www.siao2.com/2006/04/06/569632.aspx

'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; 
} 

彼のコードもご覧ください: https://stackoverflow.com/a/8705696/802848

関連する問題