2012-04-02 4 views
2

Ich möchte Text im Bearbeitungsfeld programmatisch in einem anderen Programm einrichten, das eine Spiele-App ist und DirectX verwendet, aber im Fenstermodus läuft. Ich mache das:Mit SendMessage Text in ein Bearbeitungssteuerelement eingeben, das zu einem anderen Prozess gehört

HWND hWnd = FindWindow(NULL,"Game"); 
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL); 

SendMessage(edit, WM_CHAR, (TCHAR) 'H', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'E', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'O', 0); 

dies funktioniert nicht für mich .... aber einige, wie einmal gearbeitet. Ich denke, ich habe etwas falsch verstanden, vielleicht muss es sich auf die Bearbeitungssteuerung konzentrieren, dann setze den Cursor, füge den Text ein und deaktiviere den Fokus ... Ich weiß wirklich nicht viel ... bitte rette meine Zeit und Nerven, sag mir, wie ich es machen soll arbeiten ....

ich das auch versucht, und funktioniert nicht:

SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"text"); 

Hwnd ist richtig, aber Text nicht aktualisiert wird ... es handle zu korrigieren senden, aber nicht aktualisiert .... Ich denke, ich muss mich irgendwie konzentrieren oder updaten, sobald es erfolgreich aktualisiert wurde, aber ich habe nicht realisiert, was passiert ist ... also funktionierte Code einmal, aber nicht mehr ... Warum funktionierte es einmal?

+2

Warum verwenden Sie nicht einfach 'WM_SETTEXT', anstatt zu versuchen, die Eingabe zu fälschen? –

+0

@ David Heffernan Ich versuchte dies, aber nicht funktioniert: SendMessage (Hwnd, WM_SETTEXT, NULL, (LPARAM) "MyText"); Ich denke, ich muss den Fokus oder andere Dinge tun, bevor ich Text setze ... aber wie? – Jigberto

+2

Es gibt keine Fehlerprüfung bei den FindWindow-Aufrufen. Funktionieren sie? Sie müssen Debugging durchgeführt haben, ja? –

Antwort

4

Ihre Frage ist Geld! Ernsthaft. Angenommen, ein kleiner Vogel hat mir gesagt, an welchem ​​Spiel Sie interessiert sind (beginnt mit einem S). Ich habe mich selbst ein paar Stunden mit diesem Problem beschäftigt und ich hatte Erfolg, also werde ich es mit dir teilen.

Es gibt ein Tool mit dem Namen Spy++ (von Microsoft), mit dem Sie Nachrichten ansehen können, die an ein Fenster/eine Klasse gesendet werden. Dies ist großartig für das Debuggen, da es Ihnen ermöglicht, die Nachrichten zu überwachen, die an das EDIT-Feld gesendet werden, wenn eine Taste auf Ihrer Tastatur gedrückt wird, so dass Sie die genauen Aufrufe und Parameter herausfinden können, die an das Spiel gesendet werden, um diesen Vorgang zu simulieren.

Verwenden Sie spy ++, um den Spielprozess zu öffnen, und sobald Sie im Anmeldefenster von Game sind, sehen Sie, dass spy ++ mehrere in diesem Prozess geöffnete Threads meldet, aber nur ein Thread hat 3 EDIT-Boxen. Das ist der Thread, an dem Sie interessiert sind!

auch feststellen, dass keiner der Editboxen Beschriftung haben, so dass der folgende Code wird nie funktionieren:

HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL); 

und übrigens, immer darauf achten, dass FindWindowEx() Renditen etwas gültig, sonst wie würden Sie wissen, dass Es ist gelungen, das Bearbeitungsfeld zu finden?

Was sollten Sie tun, stattdessen ist:

HWND edit = FindWindowEx(hWnd, NULL, "", NULL); 
if (!edit) 
{ 
    // report error 
} 

Und dies wird das erste Eingabefeld finden.Diese Box entspricht dem Feld Benutzername. Das Spiel nutzt 3 PostMessage() Anrufe einen Tastendruck zu simulieren, und nichtSendMessage() wie Sie versuchen:

// "..." means you need to find out the other parameters 
PostMessage(edit, WM_KEYDOWN, ...); 
PostMessage(edit, WM_CHAR, ...); 
PostMessage(edit, WM_KEYUP, ...); 

Spy ++ wird zeigen, was die anderen Parameter sind, keine Sorge. Sie werden wahrscheinlich einige Zeit damit verbringen herauszufinden, wie der letzte Parameter des Aufrufs aufgebaut ist (weil es eine Maske ist).

Ich konnte keine Schlüssel an das Spiel senden, wenn es minimiert oder ohne Fokus war. Sie müssen dieses herausfinden. Zu Testzwecken können Sie SetForegroundWindow(window_hwnd); und einige weitere Dinge verwenden, um das Fenster zu fokussieren.

2

Suchen Sie nach dem Quellcode Autoit. Autoit ist in der Lage, Schlüssel/Maus an fast alles zu senden. Wenn neuere Versionen von Kaspersky Anti-Virus installiert werden, führt dies zu Problemen zwischen den Prozessen SendMessage|SendInput.

Edit: Für die Leute, die darauf hinweisen, dass Autoit ein großer Klumpen-Code ist zu graben, durch diese Aufgabe zu erfüllen:

Autoit ist in der Lage Eingang Hintergrund apps zu senden, die nicht wollen, injiziert Eingang sehen . Es ist keine einfache Aufgabe, die leicht gemacht wird. Es gibt Spiele da draußen, die keine skriptgesteuerten Eingaben irgendeiner Form sehen wollen und sie tun alles, um es zu verhindern. Außerdem gibt es AV-Lösungen in der Wildnis, die die Interprozess-Eingangsinjektion blockieren. Autoit funktioniert in vielen Fällen irgendwie um die Blöcke herum.

+0

Nizza Punkt über die AV-Software - Ich hatte auch Probleme mit Kaspersky, (aber nicht diese, noch ..) –

+2

Ist Ihre Antwort wirklich zum Download der keine Zweifel riesige Menge von Quellcode für Autoit und jagen um zu versuchen, es zu verstehen? Klingt nicht der produktivste Ansatz für mich. –

+0

Dieses Programm, an das ich Text senden möchte, ist ein Spiel, und es ausblenden Bearbeitungsfeld, wenn die Maus Cursor bewegt wird out und es zeigt, wenn der Mauszeiger nach oben bewegt wird, ... also muss es vielleicht fokussiert oder aktiviert sein, bevor ich Text an es sende, aber ich weiß nicht, wie das geht .... Ich versuche es in Spy ++ zu sehen und es zu zeigen Nachrichten ..... – Jigberto

Verwandte Themen