簡體   English   中英

C# 熱鍵字母不正確

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM