Как я могу имитировать нажатие клавиш для любого окна с фокусом в данный момент?

Я пытаюсь изменить клавиши, которые моя клавиатура отправляет приложениям. Я уже создал глобальную ловушку и могу предотвратить получение ключей, которые мне нужны, но теперь я хочу отправить новый ключ на место. Вот моя процедура с крючком:

LRESULT __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    int ret;

    if(nCode < 0)
    {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }

    kbStruct = (KBDLLHOOKSTRUCT*)lParam;

    printf("\nCaught [%x]", kbStruct->vkCode);

    if(kbStruct->vkCode == VK_OEM_MINUS)
    {
        printf(" - oem minus!");
        keybd_event(VK_DOWN, 72, KEYEVENTF_KEYUP, NULL);
        return -1;
    }
    else if(kbStruct->vkCode == VK_OEM_PLUS)
    {
        printf(" - oem plus!");
        keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);
        return -1;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

Я пробовал использовать SendMessage и PostMessage с GetFocus () и GetForegroudWindow (), но не могу понять, как создать LPARAM для WM_KEYUP или WM_KEYDOWN. Я также попробовал keybd_event (), который имитирует клавиши (я знаю, потому что этот процесс ловушки улавливает имитируемые нажатия клавиш), включая 5 или 6 различных кодов сканирования, но ничего не влияет на мое окно переднего плана.

Я в основном пытаюсь превратить полосу масштабирования на моем ms3200 в элемент управления прокруткой, поэтому я могу даже отправлять неправильные клавиши (ВВЕРХ и ВНИЗ).


person scottm    schedule 30.01.2009    source источник


Ответы (3)


Вызов keybd_event правильно. Если все, что вы делаете, это нажатие клавиши, возможно, окно вместо этого обрабатывает сообщение о нажатии клавиши. Вам действительно нужно отправить ключ вниз, а затем ключ вверх:

keybd_event(VK_UP, 75, 0, NULL);
keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);

Или, что еще лучше, отправьте ключ вниз, когда ключ OEM опускается, и ключ вверх, когда ключ OEM поднимается. Вы можете определить состояние включения / выключения по kbStruct-> flags и LLKHF_UP.

person Tadmas    schedule 31.01.2009

Вы можете использовать SendInput как keybd_event как было заменено. В статье журнала MSDN Magazine Вопросы и ответы о C ++: отправка нажатий клавиш в любое приложение есть полезный пример.

person Raj    schedule 11.03.2009

Вы можете попробовать Control-UpArrow и Control-DownArrow вместо Up и Down. Однако, похоже, это работает не для всех приложений, и даже для приложения, в котором это действительно работает, это может зависеть от того, на чем сосредоточен фокус.

person jdigital    schedule 31.01.2009