Tatstatureingaben an fremdes Fenster senden

Kaiser206

Erfahrenes Mitglied
Hallo,
ich habe folgende Funktion geschrieben:

void sendKey(HWND window, char key)
{
SendMessage(window, WM_KEYDOWN, key, 0);
SendMessage(window, WM_KEYUP, key, 1);
}

Sie soll eine beliebige Taste an ein Fenster senden zb Notepad.
allerdings funktioniert sie nicht. Kann mir bitte jemand meinen Fehler zeigen?

Danke im Vorraus!

(g++ / windows)
 
HTML:
void sendKey(HWND window, char key)
{
   PostMessage(window, WM_KEYDOWN, key, 0);
   PostMessage(window, WM_KEYUP, key, 1);
}

Damit kann ich jetzt text an calc und cmd schicken. Wenn ich jetzt aber etwas an Notepad / Wordpad sende passiert nichts. Die Eingaben kommen an aber nicht im Textfeld(F1 funktioniert zb). Muss man bei notepad das textfeld einzeln ansprechen?
 
cmd und calc haben nur ein Eingabefeld, sprich das MainWindow selbst processed jeden keydown.
Natürlich benutzen Programme wie Wordpad mehrere Child´s innerhalb ihrer Fenster, wobei keydown im MainWindow vermutlich nur auf bestimmten keys, wie z.B. Esc processed wird.
Darum kannst du zwar eine keydown message senden, aber processed wird sie nicht, solange nicht das richtige child Fenster den Focus hat.
Stell dir vor du sendest VK_RETURN ans Programm, während gerade das Menü auf Datei-beenden den Focus hat.

@ _Van
Der Versuch über die ProcessIDd ran zu kommen scheitert auch, weil du
1) Nicht weisst, ob der gesuchte Empfänger überhaupt ForegroundWindow ist
2) Selbst wenn du das richtige Fenster findest, du immer noch nicht weisst, welcher Thread in dessen Programm gerade Current ist. Wenn das z.B. ein timer ist, landet dein input auch im Nirwana.
 
gibt es denn sonst eine möglichkeit tasten an ein fenster zu senden? Mit SetForegroundWindow() und SendInput() klappt es ja in den notepad zu schreiben. Das Fenster muss aber halt den Focus haben.
 
Selbst SetForegroundWindow() funktioniert nur dann, wenn der aufrufende Thread selbst ForegroundWindow ist, wobei nach SetForegroundWindow() der aufrufende Thread nicht mehr selbst ForegroundWindow ist, sprich sobald der User irgendwohin klickt, kommen weitere Messages nicht mehr an, bzw. werden nicht mehr processed.

Es gibt keine Möglichkeit aus einer Anwendung heraus Messages an ein Child einer anderen Anwendung zu schicken, einfach weil das HWND des fremden Child im Rest vom System nicht gültig ist, selbst wenn du den Namen vom Child kennst geht es nicht.
Nur dann, wenn das MainWindow einer Anwendung selbst die Message verarbeitet oder weiterleitet, so wie z.B. SendInput() bei Notepad das macht, kommt eine Message an, in allen anderen Fällen nicht.
Du kannst vielleicht noch mit simulierten Mausbewegungen und Klick das richtige Fenster aktivieren, aber dem dann eine KEYDOWN Message zu schicken scheitert wieder daran, dass das HWND des Child im Rest vom System nicht gültig ist.
 
Zurück