Отправить нажатия клавиш в играх с помощью прямого ввода - PullRequest
6 голосов
/ 04 января 2009

Я могу отправить любые нажатия клавиш Windows приложения с PostMessage API. Но я не могу отправить нажатия клавиш в окно игры, используя PostMessage.

Кто-нибудь знает что-либо об использовании функций прямого ввода для отправки ключей в игры из C #.

Ответы [ 5 ]

6 голосов
/ 04 января 2009

Альтернативным способом было бы подключить DirectInput API напрямую - Microsoft Research уже предоставила библиотеку для этого: http://research.microsoft.com/en-us/projects/detours/

Как только вы подключитесь к API, вы можете делать с ним все, что захотите. Однако стоит отметить, что в последних версиях Windows DirectInput для ввода с помощью мыши и клавиатуры является просто оболочкой для сообщений Windows Win32. DirectInput создает поток в фоновом режиме и просто перехватывает оконные сообщения, прежде чем передать их обратно в приложение. Это одна из причин, по которой Microsoft больше не рекомендует использовать DirectInput. Это означает, что такие API-интерфейсы обмена сообщениями, как PostMessage , должны работать нормально.

4 голосов
/ 03 января 2014

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

Вы можете использовать Драйвер перехвата клавиатуры Oblita (для Windows 2000 - Windows 7) и перехват библиотеки C # (переносит драйвер клавиатуры для использования в C #).

С его помощью вы можете делать такие классные вещи, как:

input.MoveMouseTo(5, 5);
input.MoveMouseBy(25, 25);
input.SendLeftClick();

input.KeyDelay = 1; // See below for explanation; not necessary in non-game apps
input.SendKeys(Keys.Enter);  // Presses the ENTER key down and then up (this constitutes a key press)

// Or you can do the same thing above using these two lines of code
input.SendKeys(Keys.Enter, KeyState.Down);
Thread.Sleep(1); // For use in games, be sure to sleep the thread so the game can capture all events. A lagging game cannot process input quickly, and you so you may have to adjust this to as much as 40 millisecond delay. Outside of a game, a delay of even 0 milliseconds can work (instant key presses).
input.SendKeys(Keys.Enter, KeyState.Up);

input.SendText("hello, I am typing!");

/* All these following characters / numbers / symbols work */
input.SendText("abcdefghijklmnopqrstuvwxyz");
input.SendText("1234567890");
input.SendText("!@#$%^&*()");
input.SendText("[]\\;',./");
input.SendText("{}|:\"<>?");

Поскольку механизм этих нажатий клавиш - это драйвер клавиатуры, он практически не ограничен.

1 голос
/ 04 января 2009

Теперь есть способ сделать это через DirectInput API.

Единственный способ архивировать тот же эффект - написать собственный COM-объект DirectInput, который просто оборачивает обычный объект DirectInput. После этого вы можете добавить код для имитации нажатия клавиш. Хитрость в том, чтобы заменить Win32 dinput.dll вашей версией. Все игры будут загружать вашу DLL при запуске.

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

0 голосов
/ 14 июня 2018

Работал для друзей Игра (Nostale) без пробемов:

Также здесь полезный список кодов виртуальных ключей

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

        private void button1_Click(object sender, EventArgs e)
        {
            const int WM_SYSKEYDOWN = 0x0104;
            const int VK_SPACE = 0x20;

            IntPtr WindowToFind = FindWindow(null, "WINDOW NAME");

            PostMessage(WindowToFind, WM_SYSKEYDOWN, VK_SPACE, 0);
        }
0 голосов
/ 08 ноября 2011

Для этого вы можете использовать неуправляемую функцию SendInput. Он размещает данные на уровне ниже DirectInput. Очень важно знать, какие коды отправлять. Они могут варьироваться между играми. Если виртуальные коды клавиш Windows не работают для игры, вы можете попробовать отправить константы DIKEYBOARD (например, DIKEYBOARD_A и т. Д.), И если это все еще не работает, продолжайте попытки. Например, Half Life или Counter Strike ожидают коды ASCII в качестве кодов клавиш (мне понадобилось время, чтобы понять это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...