キーボードからユーザーの種類のテキストを取得しようとしています。私は英語のキーボードレイアウトを持っているとすべてうまく動作しているようですが、バスをロシア語に変更すると動作しません。私は使用しました現在の言語レイアウトのために押されたキーが検出されました。C#
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
if ((Keys)vkCode == Keys.Enter || (Keys)vkCode == Keys.Tab || (Keys)vkCode == Keys.LButton || (Keys)vkCode == Keys.RButton)
WriteNewLine(_text);
else
if (ShiftKey)
_text += GetCharsFromKeys((Keys)vkCode, true, false);
else
_text += GetCharsFromKeys((Keys)vkCode, false, false);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
この関数は、キーコードを取得します。ご覧のとおり、私は次の関数を呼び出します
static string GetCharsFromKeys(Keys keys, bool shift, bool altGr)
{
var buf = new StringBuilder(256);
var keyboardState = new byte[256];
if (shift)
keyboardState[(int)Keys.ShiftKey] = 0xff;
if (altGr)
{
keyboardState[(int)Keys.ControlKey] = 0xff;
keyboardState[(int)Keys.Menu] = 0xff;
}
ToUnicode((uint)keys, 0, keyboardState, buf, 256, 0);
return buf.ToString();
}
実際のキーはどのユーザータイプを返します。しかし、ENGのキーボードレイアウトでのみ機能します。 国際的なキーボードレイアウト処理を追加する方法が分かっている場合は、plsに教えてください。 P.P.私が入力した場合:
Руский
を私が手:
Hecrbq
@ニッカ私は知っている、これは私がtoUnicode関数を使用する理由です。それはのToUnicodeのドキュメントを見て対応するUnicode文字 –
に指定された仮想キーコードとキーボードの状態を変換し、私はあなたが 'H'キーをヒットした場合、それは、言っているか理解とは思わない、そのキーコードは0x48であり、これはfunnily十分にユニコードでは0x0048ではなく、0x0420はРは –
ですこれはスレッドローカルフックまたはシステム全体のフックですか?また、なぜWM_KEYDOWNの代わりにWM_CHARをトラップしないのですか? –