Как мне имитировать прямой ввод в неактивное окно?

Я хочу отправить прямой ввод в (возможно) неактивное окно в python. До сих пор я нашел решение для отправки прямого ввода через ctypes и у меня есть решение для имитации ввода в окно, которое не работает с некоторыми играми, поскольку та, которую я тестирую (GTA V), использует прямой ввод, используя postMessage()via py32win.

Итак, как мне теперь симулировать эти прямые входы, когда целевое окно, возможно, не активно? Это вообще возможно?

Я думаю, что так и должно быть, потому что, например, AutoHotkey может отправлять прямые сообщения в таком случае.

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


person DJSchaffner    schedule 27.03.2019    source источник
comment
Я не эксперт в этих вещах, но я думаю, что они будут выполнены с помощью модулей win32gui, win32con, верно? Я знаю, что вы можете найти дескрипторы для окон, такие как hwnd = win32gui.FindWindow(None, 'GTA V') или что-то подобное, и представляете ли вы, что, получив дескриптор окна, вы можете просто отправить ему ключи? IDK Я никогда не делал этого раньше   -  person Reedinationer    schedule 28.03.2019
comment
Ну, это моя проблема. Технически я заставил его работать так, как вы сказали, но поскольку GTA V в этом случае, например, ожидает прямого ввода, он просто игнорирует нажатия клавиш, которые отправляются ему через postMessage(hwnd, WM_KEYDOWN, wparam, lparam). Таким образом, я ищу способ имитировать прямой ввод, который он ожидает   -  person DJSchaffner    schedule 28.03.2019
comment
О, я вижу, это та же проблема, с которой я столкнулся, пытаясь сделать проект. Я попытаюсь (снова) решить это для нас обоих :)   -  person Reedinationer    schedule 28.03.2019
comment
Итак, вы говорите, что для игры требуются коды сканирования, как показано в stackoverflow.com/questions/14489013/, и вы уже реализовали подобное решение, которое работает для активного окна, и вам просто нужно найти способ их отправки в неактивное окно?   -  person Reedinationer    schedule 28.03.2019
comment
Правильно. Я хотел бы отправить эти прямые входы в определенное окно. Ценю твою помощь!   -  person DJSchaffner    schedule 28.03.2019


Ответы (1)


Насколько я понимаю, вы не можете этого сделать. Обходной путь (находится по адресу https://www.reddit.com/r/Python/comments/5wpxtt/automation_in_inactiveunfocused_window/) будет

  • получить виртуальную машину на своей машине
  • загрузите игру и ваш скрипт на виртуальную машину
  • запустите игру и пусть ваш скрипт взаимодействует с активным окном (на виртуальной машине)
  • свернуть окно виртуальной машины вашей основной машины
person Reedinationer    schedule 28.03.2019
comment
М-да, может быть, нет никакого способа сделать это. Однако это хороший обходной путь, который вы нашли, к сожалению, я считаю, что его нецелесообразно использовать, потому что виртуальная машина слишком медленная для такой игры, тем более что я бы хотел играть, когда бот не активен: D Проголосуйте - person DJSchaffner; 29.03.2019
comment
@DJSchaffner Я возьму это :) - person Reedinationer; 29.03.2019