"SendMessage" an 3 verschiedenen Prozessen in C++
Will ich senden Sie Tastenanschläge an mehrere Prozesse. Zum Beispiel, wenn ich "1" drücken, dann soll ich zum senden der "1" bis 3 "Notepad" von windows". Erst will ich versuchen, senden einer Tastatureingabe in notepad, aber es scheitert an die HWND-Eigenschaft:
//HANDLE hWin;
HWND windowHandle = FindWindowA(NULL, "Notepad"); //Can’t find a proccess
//Send a key
if( windowHandle ) //This one fails
{
while(true)
{
if( GetAsyncKeyState(VK_F12) != 0 )
{
SendMessageA(windowHandle, WM_KEYDOWN, VK_NUMPAD1, 0);
Sleep(1000);
SendMessageA(windowHandle, WM_KEYUP, VK_NUMPAD1, 0);
}
Sleep(100);
}
}
Aber das "FindWindow" - Methode ist nicht gut genug für mein Programm. Es gibt auch keine Möglichkeit, an 3 verschiedenen Prozesse mit dem gleichen Namen. Also, wie kann ich 3 Griffe, 3 verschiedenen Prozesse mit dem gleichen Namen? Und wie kann ich die senden-Taste s, um die Prozesse?
- Notepad-Fenster Titel ist in der Regel "Untitled - Notepad". Und Sie wäre besser, verwenden SendInput.
InformationsquelleAutor Laurence | 2012-03-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie EnumWindows zum aufzählen aller top-level-Fenster auf das system. Sie müssen dann zum filter, durch diese Fenster zu bekommen, die Sie interessiert sind in. Klasse name ist wahrscheinlich eine bessere Wahl für die Filterung eher als der name des Fensters wenn. Hier finden Sie einige Beispiel-code (nicht getestet), was ich im Sinn haben:
Hinweis: die Verwendung von BroadcastToNotepad und wie können Sie verschiedene Handler übergeben in eine andere
lParam
.Eine Letzte Sache zu beachten ist, dass
PostMessage
/SendMessage
ist nicht eine zuverlässige Methode zur Simulation von Tastatur-Eingaben. Dies ist bereits von Raymond Chen hier.SendInput
ist der bevorzugte Weg für die Injektion Eingang. Jedoch, die Verwendung, die Sie benötigen, um sicherzustellen, das Fenster, das Sie senden möchten, um den Tastatur-Fokus hat.Ich erinnere mich vage, er spielte mit etwas, das ähnlich zu dem, was Sie tun in der Vergangenheit. Wenn ich mich richtig erinnere, müssen Sie "senden an Editor' s child-Fenster (class name =
Edit
). Also, der obige code muss geändert werden, als so:Zunächst installieren Spy++ von Visual Studio, die ermöglicht es Ihnen, die HWND-Fenster in der Hierarchie ( und den Prozess, der diese besitzt).
Dann wirst du sehen, warum Ihre FindWindow nicht. Sie werden auch wissen, die genaue Hierarchie-Aufrufe um über FindWindow und GetWindow().
Sich bewusst sein, dass seit Vista einige HWNDs sind geschützt, und Sie kann senden Ihnen, aber notepad ist wahrscheinlich gut.
Für die Zusendung der Schlüssel, können Sie wahrscheinlich nur mit PostMessage zu Feuer-und-vergessen.
Erstens, warum ist while(true) gibt? Würden Sie nicht lieber wollen, aktivieren Sie Ihre software auf die F12-Taste drücken, als wenn eine Endlosschleife? Dieser Griff ist nicht für immer gültig, Sie wissen.
Zweiten, würden Sie wahrscheinlich wollen zu verwenden EnumWindows zu gehen durch alle Fenster und finden, die Sie interessiert sind in. Dann würden Sie implementieren Sie eine callback-Funktion, die brauchen, um zu entscheiden, auf eine gewisse basis, wenn es will, zu handeln, auf einige Fenster oder nicht (sei es name oder etwas anderes).
SendMessage/SendMessageA/SendMessageW sollte nur gut funktionieren, wenn Sie gefunden haben, einen richtigen Griff für das Fenster, das Sie wollen, Ziel für (außer für einige spezielle Fenster, die sind geschützt).