Отправка ключа в игру (полноэкранный режим) - PullRequest
1 голос
/ 26 марта 2019

Я использую следующий код для отправки нажатий клавиш в Windows:

[DllImport("user32.dll", SetLastError = true)]
private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag 
public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag 
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event((byte)key, 0, KEYEVENTF_KEYUP, 0);

«ключ» может быть любым кодом клавиши.Простые, такие как символ или функциональные клавиши и т. Д.

Это прекрасно работает в «простом» приложении.Например, если я открываю NotePad ++ и моя Программа запускается в фоновом режиме, все работает как нужно.

Но когда я открываю полноэкранную игру (например, Pinball FX), нажатия клавиш, кажется, не получаются.

Я ожидаю, что проблема заключается в DirectX или чем-то подобном.Есть ли другой способ отправить ключи туда?Может быть через SharpDX?

1 Ответ

0 голосов
/ 27 марта 2019

Мне удалось решить эту проблему, используя другой подход с использованием DirectInput, как описано здесь: https://www.codeproject.com/questions/279641/c-sharp-directinput-send-key

[DllImport("user32.dll", SetLastError = true)]
        private static extern uint SendInput(uint numberOfInputs, INPUT[] inputs, int sizeOfInputStructure);

        private static void SendKeyDown(ushort keyCode)
        {
            var input = new KEYBDINPUT
            {
                Vk = keyCode
            };

            SendKeyboardInput(input);
        }

        private static void SendKeyUp(ushort keyCode)
        {
            var input = new KEYBDINPUT
            {
                Vk = keyCode,
                Flags = 2
            };
            SendKeyboardInput(input);
        }

        private static void SendKeyboardInput(KEYBDINPUT keybInput)
        {
            INPUT input = new INPUT
            {
                Type = 1
            };
            input.Data.Keyboard = keybInput;

            if (SendInput(1, new[] { input }, Marshal.SizeOf(typeof(INPUT))) == 0)
            {
                throw new Exception();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...