Domanda

Ehi ragazzi, sto cercando di inviare un messaggio a un gioco (per automatizzare i comandi di testo), il problema è che non riesco a capire come utilizzare le informazioni da Spy ++ per scrivere una funzione C# SendMessage.
Sono stato in grado di usare Spy ++ per ottenere00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
Qualcuno potrebbe fornire una rottura di ciò che questo significa e come inviare il messaggio al gioco in C#?

EDIT: ho scoperto che stavo guardando il processo sbagliato. Invece di guardare il javaw.exe, stavo guardando il gioco reale. Ecco il codice per premere 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

Grazie,
Max

È stato utile?

Soluzione

Quindi iniziamo con la firma per Invia messaggio, da Pinvoke.net:

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

Prese un manico di finestra, HWND, un ID messaggio, MSG e due parametri generici WPARAM e LPARAM che cambiano Meaing in base all'ID messaggio.

Ciò che Spy ++ ti mostra sono i parametri che sono stati inviati a SendMessage. Come puoi vedere, non ti mostra WPAM e LPARAM, ma HWND, NHittest e Wmousemsg. Questo perché Spy ++ sa cosa significano effettivamente i parametri WPAM e LPARAM Wm_setcursor messaggio e li sta decodificando per te.

Quindi decodificare ogni pezzo di What Spy ++ ha inviato:

  1. 00220540 - L'impugnatura della finestra che riceve il messaggio: il parametro HWND.
  2. S - Significa che è stato inviato tramite SendMessage () e non pubblicato tramitePostMessage (). Vedere http://msdn.microsoft.com/en-us/library/aa265147(v=vs.60).aspx
  3. WM_SETCURSOR - L'ID messaggio - Il parametro MSG.
  4. hwnd:0024052C - Muoversi della finestra contenente il cursore: il parametro WPARAM.
  5. nHittest:HTCLIENT - Il codice di test HIT - La parola bassa del parametro LPARAM.
  6. wMouseMsg:WM_MOUSEMOVE - Il messaggio del mouse - La parola alta del parametro LPARAM.

Il modo in cui vorresti inviare il messaggio a una finestra è:

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);

Per capire cosa significano altri messaggi puoi fare una ricerca su msdn.com per il messaggio nella documentazione di Windows.

Quindi, dopo aver risposto a tutto ciò, non credo che questo avrà nulla a che fare con l'invio di chiavi al gioco che stai cercando di controllare. WM_SetCursor non ha nulla a che fare con l'input della tastiera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top