Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MapVirtualKey и GetKeyNameText работают не верно

59K
11 сентября 2010 года
TOIIOP
2 / / 15.04.2010
Всем привет!

Надо правильно обработать сообщения с клавиатуры WM_KEYDOWN WM_KEYUP на numpad (дополнительной клавиатуре) не зависимо от того, включен numlock или нет.
lparam в сообщении содержит VirtualKey (зависит от numlock) и ScanCode (не зависит от numlock, но зависит от железа)

я использую ScanCode, для того, чтобы однозначно знать, с какой кнопкой имею дело, но т.к. ScanCode зависит от железа - необходимо перед стартом программы узнать правильные ScanCode для нужных VirtualKey (например NumPad0 -> ScanCode=82).

для получения сканкода и названия кнопки по нему использую следующий код:
Код:
using System.Runtime.InteropServices;
...
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern uint MapVirtualKey(uint uCode, uint uMapType);

[DllImport("user32", SetLastError = true, CharSet = CharSet.Unicode)]
static extern int GetKeyNameText(uint lParam, StringBuilder lpString, int nSize);

uint VKtoScanCode(uint VirtualKey)
{
      return MapVirtualKey(VirtualKey, 0);
}

string ScanCodeToString(uint ScanCode)
{
      StringBuilder sb = new StringBuilder(100);
      int ret = GetKeyNameText(ScanCode << 16, sb, 100);
      return sb.ToString();
}

public Form1()
{
      InitializeComponent();
      uint sc = VKtoScanCode((uint)Keys.NumLock);
      textBox1.Text = sc.ToString() + " (" + ScanCodeToString(sc) + ")";
}


и тут возникает такой проблем:
Keys.NumLock -> 69 (Pause) //перепутаны кнопки Pause и NumLock
Keys.Pause -> 0 () //MapVirtualKey ничего не вернул
Keys.Insert -> 82 (Num 0) //перепутаны Num 0 и Insert
Keys.NumPad0 -> 82 (Num 0) //все верно
Keys.NumPad1 -> 79 (Num 1) //все верно
Keys.Divide -> 53 (.) //знак деления превратился в точку но сканкод верный

и т.д.
при этом функция GetKeyNameText английские буквы переводит в заглавные английские, а символы ,./;'\[] в соответствующие им строчные русские.

как это все победить? :(
63K
11 сентября 2010 года
BigKashalot
1 / / 11.09.2010
Цитата: TOIIOP

как это все победить? :(


Использовать C++?:(

59K
12 сентября 2010 года
TOIIOP
2 / / 15.04.2010
вот чего нашел:
http://support.microsoft.com/kb/72583

т.е. это в порядке вещей, если правильно перевел английский(
значит должен быть какой-то другой способ получения правильных значений скэнкода.

а тут говорится про баг в функции.
http://www.pcmag.com/article2/0,2817,1161795,00.asp
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог