Преобразовать символ в соответствующий код виртуальной клавиши - PullRequest
5 голосов
/ 29 мая 2010

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

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

Спасибо

1 Ответ

7 голосов
/ 29 мая 2010

Вы должны быть более ясны в том, что ваши требования, более конкретно, в том, что вы считаете подходящим кодом ключа. 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...