2011-02-02 5 views
2

Hé les gars, j'essaie d'envoyer un message à un jeu (pour automatiser les commandes de texte), le problème est que je ne peux pas comprendre comment utiliser les informations de spy ++ pour écrire un C# sendmessage fonction.
Je pouvais utiliser spy ++ pour obtenir 00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
Quelqu'un pourrait-il fournir une ventilation de ce que cela signifie, et comment envoyer le message au jeu en C#?Envoyer un message à partir de Spy ++

EDIT: J'ai découvert que je regardais le mauvais processus. Au lieu de regarder le javaw.exe, je regardais le jeu réel. Voici le code pour presser t:

<00919> 0038062A WM_INPUT nInputCode:RIM_INPUT hRawInput:189E0973 
<00920> 0024052 P WM_KEYUP nVirtKey:'T' cRepeat:1 ScanCode:14fExtended:0fAltDown:0fRepeat:1fUp:1 

Merci,
Max

+0

quelle fonction C# SendMessage? Énoncez la classe complète .Net. –

+0

Peu importe, je vais poster ce que j'utilisais, mais je peux facilement le changer, si quelqu'un publie une solution différente. – Ben

+0

Considérant les dernières modifications, y a-t-il encore une question ici? Si oui, qu'est-ce que c'est? –

Répondre

6

permet donc commencer par la signature de SendMessage, de Pinvoke.net:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

Il taks une poignée de fenêtre, hWnd, un ID de message, Msg, et deux paramètres génériques wParam et lParam qui changent de message en fonction de l'ID de message.

Ce que Spy ++ vous montre sont les paramètres qui ont été envoyés à SendMessage. Comme vous pouvez le voir, wParam et lParam ne s'affichent pas, mais hwnd, nHittest et wMouseMsg. En effet, Spy ++ sait ce que les paramètres wParam et lParam signifient pour un message WM_SETCURSOR et les décode pour vous.

décodage Donc, chaque morceau de ce que Spy ++ a envoyé:

  1. 00220540 - la poignée de fenêtre de réception du message - le paramètre hWnd.
  2. S - Cela signifie qu'il a été envoyé via SendMessage() et qu'il n'a pas été envoyé via PostMessage(). Voir http://msdn.microsoft.com/en-us/library/aa265147(v=vs.60).aspx
  3. WM_SETCURSOR - L'ID de message - le paramètre Msg . - handle de la fenêtre contenant le curseur - le paramètre wParam .
  4. nHittest:HTCLIENT - le code de test d'atteinte - le mot le plus faible du paramètre lParam . - le message de la souris - le mot haut du paramètre lParam .

La façon dont vous iriez d'envoyer le message à une fenêtre est:

enum WindowMessages { 
    WM_SETCURSOR = 0x0020, 
    WM_MOUSEMOVE = 0x0200, 
    .... 
} 

enum HitTestCodes { 
    HTCLIENT = 1, 
    .... 
} 

.... 
IntPtr hWnd = [get your window handle some how] 
int lParam = ((int)WindowMessages.WM_MOUSEMOVE) << 16 + (int)HitTestCodes.HTCLIENT; 
SendMessage(hWnd, (uint)WindowMessages.WM_SETCURSOR, hWnd, (IntPtr)lParam); 

Pour comprendre ce que les autres messages signifient que vous pouvez faire une recherche sur Msdn.com pour le messsage dans la documentation de Windows. Donc, après avoir répondu à toutes ces questions, je ne pense pas que cela aura quelque chose à voir avec l'envoi de clés au jeu que vous essayez de contrôler. WM_SETCURSOR n'a rien à voir avec l'entrée au clavier.

+0

Merci pour le freinage, c'est très utile. Le jeu est codé en Java. Quand j'appuie sur t (pour faire apparaître la zone de message), cela donne le message ci-dessus. Mais quand je tape, je n'ai rien. Est-ce que cela pourrait passer par l'exécution Java? – Ben

+0

Je ne sais pas si cela a quelque chose à voir avec le Java Runtime. L'envoi de fausses entrées au clavier et à la souris n'est pas un processus fiable sous Windows. La seule chose que je pourrais suggérer est de s'assurer que la fenêtre correcte a le focus avant d'appeler SendKeys - puisque l'entrée est toujours envoyée à la fenêtre focalisée. – shf301

+0

J'ai modifié mon post, je regardais le mauvais processus, si vous pouviez expliquer ce message, je serais très reconnaissant. – Ben

Questions connexes