2009-01-03 8 views
4

Je peux envoyer des frappes de touches d'application Windows avec PostMessage() api.Mais je ne peux pas envoyer de coups de touches à la fenêtre de jeu en utilisant PostMessage. Tout le monde sait quoi que ce soit à propos de l'utilisation des fonctions d'entrée directe pour envoyer des clés à des jeux à partir de C#.Envoyer des frappes de touches aux jeux

+0

N'est-ce pas un doublon de http://stackoverflow.com/questions/407020/about-my-macro-programs? Si non, pourquoi avez-vous créé un nouveau compte? – M4N

+0

non ce n'est pas en double. Je n'ai pas créer un nouveau compte. Le nom de compte est toujours le même. Et je veux envoyer des clés aux jeux. Non aux applications de Windows. –

+0

maybee Il me manque soemthign mais ne sont pas des jeux Window Applications? Est-ce que les jeux n'ont pas de boucle de messages qu'ils pompent l'entrée de l'utilisateur? – JoshBerke

Répondre

5

Une autre façon serait de brancher l'API DirectInput directement - Microsoft Research a fourni une bibliothèque pour faire déjà: http://research.microsoft.com/en-us/projects/detours/

Une fois que vous crochet dans l'API, vous pouvez faire ce que vous voulez. Cependant, il est à noter que dans les versions récentes de Windows, DirectInput pour la souris & entrée de clavier est juste un emballage autour des messages Windows Win32. DirectInput génère un thread en arrière-plan et intercepte simplement les messages de la fenêtre avant de les transmettre à l'application. C'est l'une des raisons pour lesquelles Microsoft ne recommande plus l'utilisation de DirectInput - et cela signifie que les API de messagerie telles que PostMessage devraient fonctionner correctement ().

+0

Wow! Ils ont changé ça? Bon à entendre. Je n'ai jamais vraiment aimé DInput. –

0

Il existe maintenant un moyen de le faire via l'API DirectInput. La seule façon d'archiver le même effet serait d'écrire votre propre objet COM DirectInput qui enveloppe juste l'objet DirectInput normal. Ensuite, vous pouvez ajouter du code pour simuler des frappes. L'astuce consiste à remplacer le Win32 dinput.dll par votre version. Tous les jeux chargeront ensuite votre DLL au démarrage.

Je crains que vous ne puissiez pas le faire à partir d'un langage géré. Vous devez le faire avec du code natif car il nécessite un peu de piratage de bas niveau.

0

Vous pouvez utiliser la fonction SendInput non managée pour cela. Il poste l'entrée à un niveau inférieur à DirectInput. Il est très important de connaître les codes clés à envoyer. Ceux-ci peuvent varier entre les jeux. Si les codes de touches Windows Virtual ne fonctionnent pas pour un jeu, vous pouvez essayer d'envoyer des constantes DIKEYBOARD (comme DIKEYBOARD_A etc.) et si cela ne fonctionne toujours pas, essayez. Half Life ou Counter Strike, par exemple, attendent des codes ASCII comme codes clés (cela m'a pris du temps)

2

Une alternative, au lieu de se connecter à DirectX, consiste à utiliser un pilote de clavier (ce n'est pas SendInput ()) pour simuler les appuis sur les touches et les presses de la souris.

Vous pouvez utiliser Oblita's Interception keyboard driver (pour Windows 2000 - Windows 7) et le C# library Interception (enveloppe le pilote de clavier à utiliser en C#).

Avec elle, vous pouvez faire des choses cool comme:

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("[email protected]#$%^&*()"); 
input.SendText("[]\\;',./"); 
input.SendText("{}|:\"<>?"); 

Parce que le mécanisme derrière ces touches est un pilote de clavier, il est à peu près sans restriction.

Questions connexes