[英]C# hotkeys incorrect letters
我使用SetWindowHook
為即時全局熱鍵設置了一個低級鍵盤鈎子。 但是,當我嘗試對諸如“;”[],/'之類的字母使用熱鍵時,它會返回不正確/高值的字母。 就像當我按下逗號時,它給了我一個 1/4 號。
這是回調
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
char letter;
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
letter = (char)vkCode;
// converts letters to capitals
if (char.IsLetter(letter) == true)
{
if ((((ushort)GetKeyState(0x14)) & 0xffff) != 0)
{
letter = char.ToUpper(letter);
if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0)
letter = char.ToLower(letter);
}
else if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0)
{
letter = char.ToUpper(letter);
}
else
{
letter = char.ToLower(letter);
}
}
logs.Add(letter);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
如何在不手動比較每個錯誤值的情況下獲得標點符號熱鍵?
第一個問題是,當有一個完美的RegisterHotkey
function 時,您正在使用鍵盤掛鈎來獲取熱鍵。
然后就有了鑰匙和字符是一回事的誤解。 熱鍵基於虛擬鍵,請檢查Keys
枚舉以獲取 C# 中的虛擬鍵值。 鍵和字符之間沒有一對一的映射。 許多鍵盤布局沒有[鍵。 例如在德語鍵盤上[
是altgr + 8
您需要從lParam
指向的KBDLLHOOKSTRUCT
結構中讀取scanCode
而不是vkCode
。
您需要創建一個等效於KBDLLHOOKSTRUCT
的托管struct
,然后更改您的回調以獲取該結構的ref
副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.