Преобразуйте символ в соответствующий код виртуальной клавиши

В настоящее время я использую метод VkKeyScan в API Win32 для преобразования символа в его код виртуальной клавиши. Но проблема, которую это, кажется, имеет, состоит в том, что, когда я передаю маленькие алфавиты, это хорошо работает, тогда как, когда я передаю в прописном алфавите, он не возвращает соответствующий код клавиши и так же со специальными символами как" (" или "}".

Как я делаю это? Есть ли так или иначе, чтобы я непосредственно преобразовал строку в ее виртуальный эквивалент, не рассматривая, содержит ли она использованные для своей выгоды или специальные символы?

Спасибо

6
задан João Angelo 29 May 2010 в 11:51
поделиться

1 ответ

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

Это продемонстрировано в приведенном ниже фрагменте кода, который использует символ '('' в качестве входных данных для метода VkKeyScan.

[DllImport("user32.dll")]static extern short VkKeyScan(char ch);

static void Main(string[] args)
{
    var helper = new Helper { Value = VkKeyScan('(') };

    byte virtualKeyCode = helper.Low;
    byte shiftState = helper.High;

    Console.WriteLine("{0}|{1}", virtualKeyCode, (Keys)virtualKeyCode);
    Console.WriteLine("SHIFT pressed: {0}", (shiftState & 1) != 0);
    Console.WriteLine("CTRL pressed: {0}", (shiftState & 2) != 0);
    Console.WriteLine("ALT pressed: {0}", (shiftState & 4) != 0);
    Console.WriteLine();

    Keys key = (Keys)virtualKeyCode;

    key |= (shiftState & 1) != 0 ? Keys.Shift : Keys.None;
    key |= (shiftState & 2) != 0 ? Keys.Control : Keys.None;
    key |= (shiftState & 4) != 0 ? Keys.Alt : Keys.None;

    Console.WriteLine(key);
    Console.WriteLine(new KeysConverter().ConvertToString(key));
}

[StructLayout(LayoutKind.Explicit)]
struct Helper
{
    [FieldOffset(0)]public short Value;
    [FieldOffset(0)]public byte Low;
    [FieldOffset(1)]public byte High;
}

Выполнение этого фрагмента приведет к следующему результату:

// 56|D8
// SHIFT pressed: True
// CTRL pressed: False
// ALT pressed: False
// 
// D8, Shift
// Shift+8
8
ответ дан 10 December 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: