MapVirtualKeyEx
От: SubZero2000 Украина  
Дата: 07.03.05 09:59
Оценка:
Приветы !!!

Есть виртуальный и скан коды MapVirtualKeyEx возвращает чар без учёта регистра...
   HKL hkl = ::GetKeyboardLayout(0);
   TCHAR ch = (TCHAR)MapVirtualKeyEx(vkCode, 2, hkl);


Как можно исправить этот недостаток?
(с)(_SZ_)
Re: MapVirtualKeyEx
От: Alex Fedotov США  
Дата: 07.03.05 15:30
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>Приветы !!!


SZ>Есть виртуальный и скан коды MapVirtualKeyEx возвращает чар без учёта регистра...

SZ>
SZ>   HKL hkl = ::GetKeyboardLayout(0);
SZ>   TCHAR ch = (TCHAR)MapVirtualKeyEx(vkCode, 2, hkl);
SZ>


SZ>Как можно исправить этот недостаток?


ToAsciiEx/ToUnicodeEx принимают массив, показывающий текущее состояние клавиатуры, в том числе таких клавиш, как Shift и Caps Lock, непосредственно влияющих на регистр символов. А одного виртуального или скан кода недостаточно, чтобы сформировать правильный регистр.
-- Alex Fedotov
Re[2]: MapVirtualKeyEx
От: SubZero2000 Украина  
Дата: 09.03.05 08:40
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>ToAsciiEx/ToUnicodeEx принимают массив, показывающий текущее состояние клавиатуры, в том числе таких клавиш, как Shift и Caps Lock, непосредственно влияющих на регистр символов. А одного виртуального или скан кода недостаточно, чтобы сформировать правильный регистр.


Я в понедельник откопал ToAsciiEx в рсдн'е. Написал вот такую фильтрующую функцию:

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
            case WM_KEYUP:
            {
                KBDLLHOOKSTRUCT* hookStruct = (KBDLLHOOKSTRUCT*)lParam;
                
        WORD lpChar;
        BYTE lpKeyState[255];
        GetKeyboardState(lpKeyState);
                
        HWND currentHWND = GetForegroundWindow();
                
        DWORD processId;
        HKL hkl = GetKeyboardLayout(GetWindowThreadProcessId(currentHWND, &processId));
                
        if(ToAsciiEx(
            hookStruct->vkCode,
            MapVirtualKeyEx(hookStruct->vkCode, 0, hkl),
            lpKeyState,
            &lpChar,
            0,
            hkl))
        {
            ::PostMessage(hListener, HWM_GLKEYBOARDHOOK, (WPARAM)lpChar, (LPARAM)currentHWND);
        }
                break;
            }
        }
    }
    return ::CallNextHookEx(hook, nCode, wParam, lParam);
}


но символы с введённым регистром возвращаются через раз, точнее один раз, а потом регистр символов не меняется вне зависимости нажатия Caps Lock или Shift.
Где тут грабли?
(с)(_SZ_)
Re[3]: MapVirtualKeyEx
От: SubZero2000 Украина  
Дата: 18.03.05 15:04
Оценка:
Hi All !!!

Может всё-таки кто-то сталкивался с подобной проблемой... Почему практически всегда не различается регистр набранного символа???

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        switch (wParam)
        {
            case WM_KEYUP:
            {
                KBDLLHOOKSTRUCT* hookStruct = (KBDLLHOOKSTRUCT*)lParam;
             
        WORD lpChar;
        BYTE lpKeyState[255];
        GetKeyboardState(lpKeyState);
                
        HWND currentHWND = GetForegroundWindow();
                
        DWORD processId;
        HKL hkl = GetKeyboardLayout(GetWindowThreadProcessId(currentHWND, &processId));
                
        if(ToAsciiEx(
            hookStruct->vkCode,
            MapVirtualKeyEx(hookStruct->vkCode, 0, hkl),
            lpKeyState,
            &lpChar,
            0,
            hkl))
        {
            ::PostMessage(hListener, HWM_GLKEYBOARDHOOK, (WPARAM)lpChar, (LPARAM)currentHWND);
        }
                break;
            }
        }
    }
    return ::CallNextHookEx(hook, nCode, wParam, lParam);
}
(с)(_SZ_)
Re[4]: MapVirtualKeyEx
От: Stanky  
Дата: 19.03.05 18:37
Оценка:
> Почему практически всегда не различается регистр набранного символа???
>
Может потому, что не надо так извращаться, а надо использовать WM_CHAR?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: MapVirtualKeyEx
От: SubZero2000 Украина  
Дата: 21.03.05 14:48
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Почему практически всегда не различается регистр набранного символа???

>>
S>Может потому, что не надо так извращаться, а надо использовать WM_CHAR?

Мсье, понимает толк в извращениях? Может тогда укажешь мне, а то я сам невинность .

Нужен логгер, ввод текста пользователем в любом окне пишется в лог файл (текст в логе должен быть такого же регистра и языка, что и набранный пользователем). Для этого и была попытка использовать глобальный хук на тётю Клаву. Другого способа не вижу. Были попытки использавать сообщение WM_CHAR, но они ничего не дали (конечно возможно неправильно делал).
(с)(_SZ_)
Re[6]: MapVirtualKeyEx
От: Stanky  
Дата: 21.03.05 14:58
Оценка:
> Для этого и была попытка использовать глобальный хук на тётю Клаву.
>
Ааааа, дык вот откуда корни растут!!!
Тогда я пас — во всяком случае сейчас голова о другом болит!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: MapVirtualKeyEx
От: Аноним  
Дата: 05.03.07 04:11
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>Hi All !!!


SZ>Может всё-таки кто-то сталкивался с подобной проблемой... Почему практически всегда не различается регистр набранного символа???


(код поскипан)

Да простят меня за подъём старого топика, но сейчас передо мной стоит аналогичная задача — лог клавиатуры. Делаю через хук WH_KEYBOARD_LL, в нём использую ToUnicodeEx. Всё бы хорошо, но есть проблема, один в один как у топикстартера: в упор не хочет различать регистр, такое ощущение что нажатую клавишу Shift просто игнорируют. При активной русской раскладке вместо смайлика например получаем в логе 60. Подскажите куда копать ? Очень не хотелось бы извращаться и заменять результат в зависимости от состояния клавиши Shift ручками.
Re[5]: MapVirtualKeyEx
От: Аноним  
Дата: 05.03.07 19:56
Оценка:
Здравствуйте, Аноним, Вы писали:

SZ>>Может всё-таки кто-то сталкивался с подобной проблемой... Почему практически всегда не различается регистр набранного символа???


Всё, разобрался AttachThreadInput необходимо делать перед получением состояния клавиатуры.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.