Как я могу имитировать нажатие клавиш для любого в настоящее время сфокусированного окна? - PullRequest
2 голосов
/ 31 января 2009

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

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 в элемент управления прокруткой, поэтому я могу даже отправлять неправильные клавиши (ВВЕРХ и ВНИЗ).

Ответы [ 3 ]

2 голосов
/ 31 января 2009

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

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

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

1 голос
/ 11 марта 2009

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

0 голосов
/ 31 января 2009

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

...