Autor Beitrag
gangasrotogati
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 03.09.08 11:12 
Ich möchte einen simulierten Tastendruck an eine C++-Kommandozeilen-Anwendung senden - in dieser Anwendung wird der Tastendruck mit kbhit() und getch() abgefragt.
Bisher habe ich folgendes erfolglos probiert:
ausblenden Delphi-Quelltext
1:
2:
3:
hWindow:= FindWindow('cmd.exe'nil); // oder alternativ FindWindow('application.exe')
SendMessage(hWindow, WM_KEYDOWN, Ord('s'), 0);
SendMessage(hWindow, WM_KEYUP, Ord('s'), 0);


Ich bin mir nicht ganz sicher, ob es daran liegt, daß ich so das falsche Fenster-Handle bekomme, oder die Sendmessage-Befehle von der Anwendung nicht richtig verstanden werden? Ich habe im Internet noch nach einer Funktion gesucht, mit der man das Handle für ein Fenster anhand des Anwendungspfades und Dateinamens ermitteln kann, dabei aber leider keinen Code gefunden, der auch unter Windows XP funktioniert.

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mi 03.09.08 11:44 
Korrigiert mich, wenn ich mich irre, aber erwartet FindWindow nicht den "Titel" des aktuellen Fensters (du übergibst den Programmnamen)?

AXMD
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mi 03.09.08 11:55 
Entweder Fenstertitel, oder Fensterklasse, siehe Suche im MSDN FINDWINDOW. Aber sicher nicht den Dateinamen, denn eine Anwendung hat ja sehr oft mehr als ein Fenster.

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
gangasrotogati Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 03.09.08 12:01 
der Titel der Anwendung ist in diesem Fall auch der Programmname. Die Frage ist nur, ob ich das Handle vom Kommandozeilenfenster oder von der Anwendung selbst brauche.
Ich habe es auch mit FindWindow('C:\WINDOWS\system32\cmd.exe - app.exe') probiert, denn das steht beim Kommandozeilen-Fenster in der Titelleiste, bekomme aber nicht das richtige Handle.
Das Handle der Anwendung zu bekommen scheint dagegen kein Problem zu sein, denn wenn ich mir den Fenstertitel noch einmal mit GetWindowText hole, erscheint die korrekte Ausgabe:

hWindow := FindWindow('app.exe');
GetWindowText(hWindow, P, 255);
Showmessage(string(P));

SendMessage(hWindow, WM_KEYDOWN, Ord('s'), 0);
SendMessage(hWindow, WM_KEYUP, Ord('s'), 0);


Trotzdem wird der Tastendruck irgendwie nicht akzeptiert.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mi 03.09.08 12:28 
Schon WM_CHAR versucht?
gangasrotogati Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 03.09.08 16:28 
Titel: danke, es klappt
Mit "SendMessage(hWindow, WM_CHAR, Ord('s'), 0);" klappt es tatsächlich!

Vielen Dank!