Как можно отправлять команды кликов мыши и нажатий клавиш на клавиатуре в игре, когда она неактивна?

У меня есть программа для автоматизации игрового процесса, написанная на Python. Она использует драйвер interception для отправки нажатий клавиш, таких как WASD, и включает в себя OpenCV. Я уже разработал функционал до определенного этапа, но теперь меня интересует вопрос масштабирования процесса фарма. Для этого мне нужно, чтобы действия выполнялись одновременно в обоих окнах игры, иначе это не имеет смысла. 

Поэтому я решил изменить механизм нажатия клавиш, чтобы клики могли осуществляться даже в неактивном окне (без фокуса). Мой план таков: запускаю два окна, в одном из которых выполняется вход в аккаунт, а в другом — соответственно, тоже вход в свой аккаунт. И затем необходимо, чтобы фарм происходил параллельно в обоих окнах.

Я заметил, что в интернете множество примеров кода, использующих post message, send input и другие методы с привлечением win32api, однако этот подход не сработал для меня по каким-то причинам. 

Может ли кто-то из знающих помочь с данной проблемой или посоветовать, как реализовать такую функциональность? Буду очень признателен!
  • 10 декабря 2024 г. 23:53
Ответы на вопрос 2
Для автоматизации кликов мыши и нажатий клавиш в неактивных окнах игр существует несколько подходов. Однако стоит помнить о том, что автоматизация действий в играх может нарушать условия пользователя и привести к бану аккаунта, поэтому вам нужно учитывать риски, прежде чем продолжать.

Вот несколько способов, как можно отправлять команды кликов и нажатий клавиш в неактивные окна:

1. **Win32 API**:
   Если вы уже пробовали использовать `win32api` и это не сработало, вы можете попробовать другие функции из Win32 API:

   - **SendMessage** и **PostMessage**: Эти функции могут отправлять сообщения в указанные окна, но стоит отметить, что не все игры могут корректно обрабатывать эти сообщения.
   - **SetForegroundWindow**: Хотя это и приводит к фокусу окна, это может быть использовано в сочетании с другими методами, если вам нужно временно активировать окно.

   Пример кода для использования **PostMessage**:

   ```python
   import ctypes
   from ctypes import wintypes

   user32 = ctypes.WinDLL('user32', use_last_error=True)

   def click_window(hwnd, x, y):
       user32.PostMessageW(hwnd, 0x0201, 0, (y << 16) | x)  # WM_LBUTTONDOWN
       user32.PostMessageW(hwnd, 0x0202, 0, (y << 16) | x)  # WM_LBUTTONUP

   hwnd = user32.FindWindowW(None, "Название_окна")
   click_window(hwnd, 100, 200)
   ```

   Убедитесь, что `hwnd` действительно указывает на окно, в которое вы хотите отправить сообщения.

2. **Альтернативные библиотеки**:
   Вы можете попробовать использовать альтернативные библиотеки для работы с входными данными. Например:
   
   - **pyautogui**: Хотя эта библиотека предназначена для работы только с активными окнами, она может быть полезна в других частях вашего проекта.
   - **Pynput**: Эта библиотека позволяет управлять клавиатурой и мышью и может быть полезна, если вы сможете хотя бы активировать окно временно при переключении между ними.

3. **Обход протекторов игр**:
   Многие игры используют защитные механизмы, которые блокируют сторонние программы. Если это так, вам, скорее всего, придется поискать возможности обхода этих систем или работать с клиентами, которые менее защищены.

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

5. **Регулярные проверки**:
   Проверьте, что ваша программа работает без ошибок, используйте логирование для отслеживания проблем, и не забывайте тестировать каждую часть кода отдельно и в сочетании с другими частями.

Эти советы предоставляют различные подходы и могут потребовать дополнительных настроек для достижения желаемого результата. Удачи в вашей автоматизации!
Под виндой для эмуляции пользовательского ввода самое лучше решение - драйвер в ring0, т.е. в ядре ОС. Особенно для игр. В играх часто используется DirectInput и всякое такое и как результат муки с эмуляцией пользовательского ввода. А для установки драйвера он должен быть подписан (либо отключать и ломать всю защиту системы). Для AutoHotkey где-то на просторах инета такой был, ЕМНИП, возможно вам он подойдёт.
Похожие вопросы