C # горячие клавиши неправильные буквы - PullRequest
1 голос
/ 10 июля 2011

Я использовал 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);
}

Как получить горячие клавиши пунктуации, не сравнивая вручную каждое неверное значение?

Ответы [ 2 ]

2 голосов
/ 10 июля 2011

Первая проблема заключается в том, что вы используете клавиатуру для получения горячих клавиш, когда есть совершенно прекрасная функция RegisterHotkey.

Тогда возникает недоразумение, что ключ и персонаж - это одно и то же. Горячие клавиши основаны на виртуальных ключах, проверьте перечисление Keys для значений виртуальных ключей в C #. Между ключами и символами нет сопоставления 1 к 1. Многие раскладки клавиатуры не имеют клавиши [. Например, на немецкой клавиатуре [ - это altgr + 8

1 голос
/ 10 июля 2011

Вам нужно прочитать scanCode вместо vkCode из структуры KBDLLHOOKSTRUCT , на которую указывает lParam.

Вам необходимо создать управляемый struct эквивалент KBDLLHOOKSTRUCT, затем измените ваш обратный вызов на ref копию структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...