Как передать событие нажатия клавиши в окно эмулятора sega mega drive Gens (Windows)?

Добрый день.
Есть сервер (написанный на qt), которому приходят команды от клиентов (тоже qt). Сервер эти команды исполняет путем эмуляции нажатия клавиш в системе. например от клиента приходит команда "player1#d r a", то сервер "нажимает" клавиши клавиатуры, которые отвечают за кнопки "down", "right", "A" на джойстике эмулятора сеги.

Вне окна эмулятора все работает отлично. Сервер принимает команды от клиента и "нажимает" клавиши. Например, это видно, если открыть программу "Блокнот". Сервер все таки принимает команды и "нажимает" клавиши, так как в блокноте видно, как набираются команды от клиента.

Но если перевести фокус на окно эмулятора, то ничего не происходит. Складывается такое впечатление, что окно эмулятора не принимает системное сообщение о нажатии клавиши. Кто нибудь сталкивался с таким поведением окон в винде? В чем может быть причина? Очень хочется поиграть в Mortal Kombat путем набора серии команд и проверить "чье кунг-фу круче".

Эмулятор: Gens v2.14
Код эмуляции нажатия клавиши в винде:
void MyServer::sendKeyEventToSystem(Qt::Key qtKey)
{
    #ifdef Q_OS_WIN32
        INPUT ip; //устройство ввода
        ip.type = INPUT_KEYBOARD;
        ip.ki.wScan = 0;
        ip.ki.time = 0;
        ip.ki.dwExtraInfo = 0;

        //в зависимости от типа клавиши
        switch (qtKey)
        {
            // Player 1
            case Qt::Key_A: // left
                ip.ki.wVk = 0x41;
                break;
            ...
        }

        //посылаем событие нажатия клавиши
        ip.ki.dwFlags = 0;
        SendInput(1, &ip, sizeof(INPUT));

        //а затем отжатия клавиши
        ip.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, &ip, sizeof(INPUT));
    #endif
}
  • Вопрос задан
  • 3245 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы