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


Автор: qknife 12.12.2010, 18:24
Пытаюсь написать клавиатурный эмулятор мыши. Создал глобальный хук на основе WH_KEYBOARD_LL. Все запускается и вроде бы работает, но существует проблема с переключением NumLock. Эмуляция включается/отключается именно этой клавишей, а эмуляция мыши заточена на цифры дополнительной клавиатуры. Поэтому бывают случаи, когда режим эмуляции включен, а NumLock отключена - в результате цифровые кнопки не обрабатываются. Решал проблему так:
1. Завел функцию SetNumLock переключения Намлока (взял с MSDN): она синтезирует 2 keybd_event
2. Пытаюсь при старте программы всегда держать лампочку NumLock включенным. Для этого при старте вызываю принудительный SetNumLock, а в обработчике хука ставлю такой код:
Код

        PKBDLLHOOKSTRUCT Param=(PKBDLLHOOKSTRUCT)lParam;

    //здесь пропускаю "инъектный" код от принудительного включения индикатора
        if((Param->flags&16)&&Param->vkCode==VK_NUMLOCK) 
    {
    
            return CallNextHookEx(NULL,code,wParam,lParam);
    }
    if(code>=0&&Param->vkCode==VK_NUMLOCK)
    {
                //при отжатии меняю режим и включаю индикатор при эмуляции 
        if(wParam==WM_KEYUP||wParam==WM_SYSKEYUP)
        {
        
            iEmul^=true;
            if(iEmul) ::SendMessage(hWndServer,WM_STARTEMUL,0,0);
            else ::SendMessage(hWndServer,WM_STOPEMUL,0,0);
            if(iEmul) SetNumLock(true);
    
        }
//удаляю нажатие клавиши из очереди, чтобы индикатор не гас    
    return true;
    }


В результате:  лампочка успевает переключиться 1 раз, а затем не гаснет. Однако все равно режим эмуляции часто не совпадает с реальным состоянием Намлок

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

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