События SendInput не обрабатываются в определенной области пользовательского интерфейса игры.

У меня есть приложение C #, которое отправляет в игру события клавиатуры и мыши. В игре есть небольшая часть пользовательского интерфейса, которая может меняться в зависимости от того, что мы хотим видеть (например, карта GPS, различные действия и т. Д.). Иногда в этой части пользовательского интерфейса нам нужно нажать «Enter» (или другую клавишу в зависимости от того, как пользователь настроил ключи игры), чтобы что-то активировать (например, нажать Enter, чтобы активировать службу спасения).

Теперь проблема: все ключевые события, отправленные из приложения C #, обрабатываются ВНЕ этого пользовательского интерфейса, кроме этой вещи «активировать». Сначала я подумал, что есть проблема с событием клавиши «ENTER» (возврат), но после преобразования его на другую клавишу, которая работала в игре, я заметил, что эта клавиша также игнорируется.

Я не уверен, что это проблема, связанная с тем, как я отправляю сообщения (возможно, для этого нужен определенный параметр), и ее можно исправить, изменив мое приложение, или это какая-то блокировка в игре - и в этом случае ничего нет Я могу сделать.

Вот код, который я использую для отправки ключевых событий:

public static void PressKey(short key)
        {
            INPUT[] inputs = new INPUT[]
            {
                new INPUT
                {
                    type = INPUT_KEYBOARD,
                    u = new InputUnion
                    {
                        ki = new KEYBDINPUT
                        {
                            wVk = (ushort)0,
                            wScan = (ushort)key,
                            dwFlags = KEYEVENTF_SCANCODE,
                            dwExtraInfo = IntPtr.Zero,
                        }
                    }
                },
                new INPUT
                {
                    type = INPUT_KEYBOARD,
                    u = new InputUnion
                    {
                        ki = new KEYBDINPUT
                        {
                            wVk = (ushort)0,
                            wScan = (ushort)key,
                            dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP,
                            dwExtraInfo = GetMessageExtraInfo(),
                        }
                    }
                }
            };
            SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
        }

Но, надеясь, что это 1-й случай, я был бы признателен за любую помощь с этим.

Добавлен снимок экрана, чтобы попытаться лучше объяснить проблему

  • (A) -> Это окно пользовательского интерфейса, которое требует нажатия клавиши «ENTER». Предположим, я изменил настройки игры, чтобы вместо «Enter» для действия АКТИВИРОВАТЬ была буква «E». Затем текст «Служба помощи при вызове (ENTER)» теперь будет отображать «Служба помощи при вызове (E)». По умолчанию клавиша «E» - это запуск двигателя в игре. И работает отлично (в случае (B)). Как только я изменяю E на «Активировать», он полностью игнорируется.
  • Еще один момент, который может (а может и не иметь) иметь значение, заключается в том, что F-клавиши, которые могут находиться в нижней части окна пользовательского интерфейса, также РАБОТАЮТ нормально. Надеюсь, это немного проясняет ситуацию.

person eemerge    schedule 06.08.2015    source источник
comment
Я не уверен, что у нас достаточно информации для решения проблемы? Удалось ли вам воспроизвести проблему с пошаговой отладкой?   -  person Alyssa Haroldsen    schedule 07.08.2015
comment
Я не использовал пошаговую отладку, поскольку, с моей точки зрения, событие ДЕЙСТВИТЕЛЬНО отправляется - чтобы дать другой пример, если я переключаюсь между игрой и приложением для редактирования текста, таким как Notepad ++, все работает нормально. Какую другую информацию (кроме пошаговой отладки) вы сочтете полезной?   -  person eemerge    schedule 07.08.2015


Ответы (1)


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

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

Надеюсь, это когда-нибудь поможет кому-то :)

person eemerge    schedule 08.08.2015