Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > вытащить из кода клавиши символ


Автор: Dmi3ev 19.3.2008, 23:25
проблема такая! я знаю код символа (десятичный), как узнать, что это за символ с учетом языка! т.е. есть код 65, например! надо узнать какой это символ а русская или а английская? есть ли функция, которая анализирует код с учетом языка! если нет, то подскажите, как узнать текущий язык, напишу свою функцию, которая это делает smile 
заранее спасибо.

Автор: v2v 19.3.2008, 23:26
char a = (char)65;)

Автор: Dmi3ev 19.3.2008, 23:51
не так немного выразился
Цитата

код символа 

код клавиши smile

Добавлено через 2 минуты и 40 секунд
и здесь не так
Цитата

а русская или а английская?

ф русская или а английйская?
извините за неточности, я недавно начал smile 

Автор: v2v 20.3.2008, 00:16
http://www.physik.fu-berlin.de/~goerz/misc/ascii.gif
http://www.realcoding.net/article/view/1857

Автор: korian 20.3.2008, 02:32
если в винде и про скан-код то - MapVirtualKey

Автор: Dmi3ev 20.3.2008, 12:29
объясню все подробно! я написал программу, которая записывает в файл все, что печатается с клавиатуры (вне программы). все отлично работает, только одна проблема! если человек печатает на русском, то код клавиши от этого не меняется, и когда я пишу (char)p->vkCode, то в файл записывается английская буква, соответствующая данному коду клавиши, т.е. язык никак не влияет на код клавиши. я и решил узнать, может есть функция, которая учитывая язык, и зная код нажатой клавиши будет записывать, то что человек реально печатает.
конечно несложно, зная язык и код клавиши, самому написать функцию! но перед этим я решил поинтересоваться, может не стоит изобретать велосипед smile может он уже существует smile

Добавлено через 1 минуту и 35 секунд
Цитата

Таблица ASCII кодов
коды клавиш 

спасибо, но эти данные у меня есть smile

Добавлено через 4 минуты и 13 секунд
korian, 
Цитата

если в винде и про скан-код то - MapVirtualKey

это не тот ответ, который нужен новичку вроде меня, хотя бы чуть-чуть поподробнее, если нетрудно smile 

Автор: korian 20.3.2008, 12:35
велосипед существует, я уже написал, называеться он MapVirtualKey (WinAPI-функция такая)

Автор: Dmi3ev 20.3.2008, 12:50
korian,
как пользоваться MapVirtualKey, можно маленький примерчик, допустим код клавиши 65, т.е. "ф" или "a".
помоги smile 

Автор: G0L1a7h 20.3.2008, 17:41
_http://msdn2.microsoft.com/en-us/library/ms646306(VS.85).aspx
Пользуйся гуглом.

Автор: Dmi3ev 20.3.2008, 18:30
G0L1a7h, спасибо! конечно лучше бы примерчик маленький присылать вместе с сообщением smile 

Автор: Dmi3ev 21.3.2008, 09:33
что-то у меня не получается! данную программу пишу в билдере, соответсвенно код такой
Код

static KBDLLHOOKSTRUCT *p;
p = (KBDLLHOOKSTRUCT *)lParam;
//...
fo<<MapVirtualKey(p->vkCode, 2);

ошибку не выдает, но и значение тоже возвращает не то (возвращает p->vkCode).
поясните пожалуйста, может я неправильно понял, как пользоваться этой функцией?

Автор: korian 21.3.2008, 10:55
ндя, оказалось не все так просто... MapVirtualKey для такой цели не очень годится...
вот что у меня получилось:
Код

    BYTE keybState[256];
    wchar_t ch[100];
    GetKeyboardState(keybState);
//    int a = ToUnicode(p->vkCode, p->scanCode, keybState, ch, sizeof(ch) / sizeof(ch[0]), 0);
    int a = ToUnicode(Key, MapVirtualKey(Key, 0), keybState, ch, sizeof(ch) / sizeof(ch[0]), 0);
    if (a > 0)
    {
        WideString str = Memo1->Text;
        ch[a] = 0;
        str += ch;
        Memo1->Text = str;
    }


вместо ToUnicode можно использовать ToAscii, если надо. там правда немного по другому.

Автор: Dmi3ev 21.3.2008, 22:22
korian, давай без Memo и без остальных приблудов, я правда хочу разобраться, а не получить готовый код!
у нас есть код клавиши 65 и раскладка русская, значит пользователь нажал Ф! как добиться того, чтобы это узнать?
помоги разобраться, пожалуйста

Автор: korian 22.3.2008, 05:06
я дал пример использования
основная функция для перевода virtkey + scan code в char - ToUnicode
ей передаются VirtualKey, Scan code, состояние клавы
а возвращает она символы и их количество
но использовать вам скорее всего надо ToUnicodeEx, т.к. надо будет узнавать раскладку активного потока.
Код

BYTE keybState[256];
wchar_t ch[100];
GetKeyboardState(keybState);
DWORD threadId, processId;
threadId = GetWindowThreadProcessId(GetActiveWindow(), &processId)
HKL activeHKL = GetKeyboardLayout(threadId);
int charsCount = ToUnicodeEx(virtualKey, scancode, keybState, ch, sizeof(ch) / sizeof(ch[0]), 0, activeHKL);

описание функций есть в MSDN

Автор: Dmi3ev 22.3.2008, 17:23
разобрался, спасибо большое!!!!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)