Добрый день.
Есть сервер (написанный на 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
}