Отправка нажатий клавиш с перехватом - PullRequest
0 голосов
/ 11 января 2012

Я перепробовал все обычные способы подделки действий клавиатуры (SendInput / SendKeys / etc), но ни один из них не работал в играх, использующих DirectInput. После долгих чтений и поисков я наткнулся на Interception , который является библиотекой C ++, позволяющей подключаться к вашим устройствам.

Прошло очень много времени с тех пор, как я работал с C ++ (C # ничего не существовало), поэтому у меня возникли некоторые проблемы с этим. Я вставил в пример кода ниже.

Похоже, что в любом случае было бы инициировать ключевые действия из кода, использующего это? Все образцы просто подключаются к устройствам и перезаписывают действия (x печатает клавишу y, инвертирует ось мыши и т. Д.).

enum ScanCode
{
    SCANCODE_X   = 0x2D,
    SCANCODE_Y   = 0x15,
    SCANCODE_ESC = 0x01
};

int main()
{
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionKeyStroke stroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);

    /*
    for (int i = 0; i < 10; i++)
    {
        Sleep(1000);
        stroke.code = SCANCODE_Y;
        interception_send(context, device, (const InterceptionStroke *)&stroke, 1);
    }
    */

    while(interception_receive(context, device = interception_wait(context), (InterceptionStroke *)&stroke, 1) > 0)
    {
        if(stroke.code == SCANCODE_X) stroke.code = SCANCODE_Y;

        interception_send(context, device, (const InterceptionStroke *)&stroke, 1);

        if(stroke.code == SCANCODE_ESC) break;
    }

Код, который я закомментировал, был тем, что я пробовал, но он не работал.

1 Ответ

1 голос
/ 12 января 2012

Вам нужно настроить состояния клавиш для состояний ВВЕРХ и ВНИЗ, чтобы получить нажатия клавиш.Обратите внимание, что в цикле while переменная device возвращается через interception_wait, ваш закомментированный код будет отправлять события чему? устройство не инициализировано!Забудьте свой код и попробуйте более простой.Посмотрите на строку внутри цикла с вызовом interception_send, сделайте еще два вызова после него, но не забывайте менять значение stroke.state перед каждым вызовом, используя INTERCEPTION_KEY_DOWN и INTERCEPTION_KEY_UP, чтобы вы имитировали события down и up.Вы получите дополнительные клавиши при каждом событии клавиатуры.

Также вы можете попробовать использовать INTERCEPTION_FILTER_KEY_ALL вместо INTERCEPTION_FILTER_KEY_DOWN |INTERCEPTION_FILTER_KEY_UP.Как указано на сайте, клавиши со стрелками могут быть специальными.

...