web-dev-qa-db-fra.com

Comment un programme peut-il contrôler un autre programme?

Les bots, comment fonctionnent-ils? Disent-ils au jeu vidéo qu'une touche a été enfoncée ou que la souris a été cliquée?

Si non, y a-t-il un moyen de faire dire à votre programme qu'un autre programme a appuyé sur une touche? Je voudrais faire un programme pour battre un jeu. Donc, toutes les ressources ou exemples sont appréciés.

pdate: Donc, une façon est d'émuler les frappes, alors quelles sont les méthodes pour le faire (dans n'importe quelle langue)?

39
Anton

J'ai écrit un tas de bots à un moment ou à un autre (des jeux Pogo aux Yohoho Puzzle Pirates). Pour les fenêtres, vous allez généralement envoyer des événements Win32 pour simuler les mouvements de la souris, ou usurper les messages de bas niveau réellement envoyés entre les fenêtres lorsque vous cliquez sur la souris. Cela dépend en grande partie de la réaction du programme (en acceptant le message avec les coordonnées ou, dans le cas de Java, en lisant immédiatement les coordonnées de la souris). La partie "automatisation" implique généralement la lecture de l'écran et l'écriture d'heuristiques ou d'algorithmes pour déterminer l'état, mais peut aussi être aussi agréable que le reniflage de paquets (beaucoup d'informations là-bas dans de mauvaises implémentations de poker) ou aussi hacky que la lecture directe des emplacements de mémoire. Assez grand "champ", et mal documenté car il est assez rentable et pas difficile d'y entrer.

Envoi d'entrée

C/C++ (sous Windows)

Pour les clés, essayez CodeProject:

http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx

Et des messages:

http://www.codeproject.com/KB/threads/sendmsg.aspx

Votre meilleur pari est d'apprendre à envoyer des messages à l'aide de l'API Win32, puis à utiliser quelque chose comme Spy ++ ou ses dérivés pour "rétroconcevoir" comment les KeyPresses et les mouvements de souris sont envoyés à la fenêtre.

Java

Java a une classe Robot incroyablement portable qui est capable de:

  1. Lisez les pixels de l'écran.
  2. Contrôlez la souris.
  3. Envoyer les clés.

Je donnerais un coup de feu si vous cherchez rapide et facile.

Logique de base

Ceci est décrit en détail ailleurs sur Internet, mais la plupart des bots suivent un flux de programme d'état-machine simple. Vous lisez l'écran (ou les paquets, ou la mémoire), découvrez dans quel "état" vous vous trouvez en fonction de vos lectures et des données passées, effectuez des calculs et renvoyez le résultat au programme.

La lecture de l'écran peut être difficile, mais peut être facilitée si vous considérez que la plupart du temps, il y a quelques pixels "chanceux" par rapport à la fenêtre qui vous donneront une idée de l'état du programme. Le processus de la recherche de ces pixels peut être automatisée.

50
Stefan Mai

Il existe plusieurs types de robots. D'après ce dont je me souviens quand je jouais à CS (il y a très longtemps)

Certains bots utilisent les bibliothèques de l'application elle-même pour inspecter l'environnement (la carte, où se trouvent les joueurs etc ...) Les bots utilisent également la bibliothèque pour contrôler les mouvements. Je doute qu'il existe de nombreuses implémentations de bots qui invoquent des messages de souris pour indiquer au jeu comment se déplacer, etc.

Certains bots émulent le protocole au niveau de l'application (s'il s'agit de plusieurs joueurs). En d'autres termes, le jeu n'a même pas besoin de fonctionner. Un bot peut fonctionner dans un jeu virtuel.

Je vais aller à l'encontre de ce qu'une autre affiche a suggéré: écrire un robot de jeu est probablement un exercice plus précieux que de jouer réellement au jeu, et être curieux de savoir comment ils fonctionnent est un bon signe. :)

5
cgp

Certains programmes (tels que ceux que Grind vous propose dans un MMORPG) émulent simplement les frappes. Un outil pour ce faire est AutoIt .

En ce qui concerne les bots qui jouent réellement aux jeux eux-mêmes, je n'ai vraiment rien fait avec eux, mais je suppose qu'ils utiliseraient une sorte d'ensemble d'actions prédéfinies, peut-être une heuristique, mais peu probable.

4
samoz

Le plus gros défaut de ce concept n'est pas l'entrée, mais la sortie du jeu. Votre bot ne peut pas simplement appuyer sur des touches au hasard, il a besoin de savoir ce qui "se passe". Très peu de jeux vous permettent d'interroger ces données, ce qui laisserait votre bot pour résoudre un problème très délicat - Conversion de 60 images par seconde de données visuelles 2D en un espace virtuel.

Il existe actuellement des jeux qui permettent non seulement aux joueurs de bot, mais les encouragent. Open RTS en fait partie, mais il y en a aussi des plus simples comme GUN-TACTYX et crobots qui sont de bons points de départ.

4
SpliFF

Un bot comme vous le décrivez émulera simplement les pressions sur les touches et les mouvements/clics de la souris, de sorte que le jeu ne peut pas dire si un humain joue ou un autre programme. Il n'aurait pas du tout à s'interfacer avec le jeu.

2
AlbertoPL

Les bots agiront en tant que clients du jeu (serveur). Ensuite, ils peuvent envoyer des données appropriées comme un utilisateur peut envoyer manuellement. Le bot (client) analysera les données du serveur ("quelqu'un est sur le point d'attaquer par la gauche"), et cetera. Le client doit alors être en mesure de calculer le meilleur mouvement et d'envoyer les données appropriées au serveur pour l'exécuter.

Je ne sais pas si cela fonctionnera avec tous les jeux.

2
Alan Haggai Alavi

Cela dépend beaucoup du jeu. Par exemple, j'ai créé un bot pour Travian (qui est un jeu en ligne) qui utilise Internet Explorer activeX pour automatiser les déplacements. J'ai worte l'application en c # et pour le faire faire des choses a pris environ 30 minutes. Il est simple d'appeler des méthodes sur l'ActiveX et de lui faire faire des choses comme remplir des champs de texte ou cliquer sur des boutons. Pour la connexion par exemple, j'ai utilisé ce qui suit:

var inputs = web.Document.GetElementsByTagName("input").
                        Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];

nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");

Pour les jeux sur ordinateur, les choses deviennent plus compliquées. Windows permet à une application d'envoyer des messages à une autre application, donc je suppose que vous pouvez l'utiliser pour envoyer des messages à un jeu (bien que cela fonctionne pour les jeux qui utilisent directX pour la saisie, je ne sais pas)

Je pense que AutoIT est un excellent langage pour faire ce genre de logiciel. Même si je ne l'ai pas utilisé pour créer des robots, l'envoi de clics et de clés a été très facile.

1
Geo

Ma compréhension est que la plupart des robots de jeu haut de gamme utilisent des appels système pour se mapper dans l'espace mémoire du client de jeu, procéder à une ingénierie inverse de sa disposition et manipuler directement les variables internes du programme client. C'est beaucoup plus de travail que je ne le ferais que pour le plaisir.

1
T.E.D.

Lorsque vous dites "contrôler un programme", pensez à la façon dont les programmes sont contrôlés. La plupart acceptent la saisie au clavier/souris.

Si vous écrivez un programme pour simuler la saisie clavier/souris, c'est parti.

Un corollaire à cela serait que si un programme acceptait des arguments passés à travers une zone de saisie, écrire un programme pour envoyer des arguments comme s'ils étaient envoyés via une zone de saisie.

C'est ainsi que fonctionnent tous les bots. J'espère que cela vous éclairera!

Edit: Voici comment la grande majorité des bots fonctionnent :-)

1
Travis

Vous pouvez émuler les mouvements/clics de souris et la saisie au clavier dans Java avec la classe Robot . Il vous permet également de prendre des captures d'écran.

1
Bill the Lizard