我正在嘗試從鍵盤獲取哪些用戶類型的文本。一切似乎工作正常,當我有英文鍵盤佈局,總線時,我改成俄語它不工作。我已經使用檢測到當前語言佈局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鍵盤佈局。 如果你知道如何添加國際鍵盤佈局處理,請讓我知道。 P.S.當我輸入:
Руский
我得到:
Hecrbq
@NickA我知道,這就是爲什麼我使用unnicode函數。它將指定的虛擬鍵碼和鍵盤狀態轉換爲相應的Unicode字符 –
查看ToUnicode的文檔,我不認爲你理解它的意思,如果你點擊'H'鍵,它的鍵碼是0x48,它有趣的是unicode中的0x0048,而不是0x0420像Р是 –
這是針對線程本地鉤子還是系統鉤子?另外,爲什麼不捕獲WM_CHAR而不是WM_KEYDOWN? –