key an console senden 2
Moin!
Ich möchte einen Taste an ein consolen programm senden. Zuerst wollte ich das ganze über das inputHandle der console machen aber das hat leider nicht funktioniert. Dann habe ich den Author des consolen-programms gefragt ob er die tasten vielleicht anders einließt. Er meinte er ließt die tasten mittels kbhit() und getch() ein. Wie kann ich dem consolen programm also tasten senden? Ich habe es mal so probiert:
Delphi-Quellcode:
Aber es passiert leider auch nichts :(
function enum(handle: THandle): Boolean; StdCall;
var Title : Array[0..255] of Char; ProcessId : HWND; absatz : string; begin GetWindowText(handle, Title, 255); GetWindowThreadProcessId(handle, @ProcessId); absatz := char($0D) + char($0A); if ProcessId = ProcIdBuffer then // ProcIdBuffer ist die ProcessId der mit begin // CreateProcess gestarteten consolen-applikation ShowMessage( 'ProccessId: ' + inttostr(ProcessId) + absatz + 'Title: ' + title + absatz + 'Handle: ' + inttostr(handle) ); SendMessage(handle, WM_KEYDOWN, $4E, 0); //4E = Virtual-Key Code für 'N' SendMessage(handle, WM_KEYUP , $4E, 0); end; result := true; end; procedure TMainForm.Button2Click(Sender: TObject); begin EnumWindows(@enum,0); end; Kennt ihr eine andere (funktionierende) Lösung? ciao, :?: moin339 :?: |
Re: key an console senden 2
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
anbei ein Testprogramm von Peter Below (TeamB), Du mußt nur
Delphi-Quellcode:
anpassen.
EnumChildren(FindWindow(NIL, pchar('C:\windows\system32\cmd.exe')));
Und natürlich den zu sendenden Text:
Delphi-Quellcode:
SendText('Test '+wclass); // Hier kannst Du schreiben!
|
Re: key an console senden 2
Hi
Danke für die schnelle antwort. Aber leider kann das prog bei mir nicht funktionieren. So wie ich das verstanden habe wird erst mit SetForegroundWindow() die console in den Vordergrung geholt und dann die tasten gesendet. Ich möchte aber eine Oberfläche für ein Consolen Programm schreiben, also is die console versteckt (SW_HIDE). Es würde auch nicht gerade gut aussehen wenn man sie dann zwischendurch wieder für eine sekunde sehen kann. Hat noch jemand eine Idee oder einen Tip? ciao, :?: moin339 :?: |
Re: key an console senden 2
Hallo moin339,
darf ich fragen, ob Du mein gepostetes Testprogramm auch ausprobiert hast :?: :twisted: :?: Wenn ich eine Konsole mit SW_HIDE aufmache, funktioniert das Programm trotzdem! 2 Buttons hinzugefügt:
Delphi-Quellcode:
PROCEDURE TForm1.Button2Click(Sender: TObject);
BEGIN ShellExecute(Handle, 'open', 'cmd.exe', '', '', SW_HIDE); // erzeugt eine versteckte Konsole END; PROCEDURE TForm1.Button3Click(Sender: TObject); BEGIN ShowWindow(FindWindow(NIL, pchar('C:\windows\system32\cmd.exe')), SW_SHOW); // zeigt die Konsole UND DEN GESENDETEN TEXT an END; |
Re: key an console senden 2
*versteck*
ok werde ich gleich noch mal probieren. ciao, :oops: moin339 :oops: |
Re: key an console senden 2
Moin!
Ok, das ganze funktioniert wirklich, aber leider verschwindet der fokus meines fensters für ca. eine halbe sekunde. Gibt es noch eine andere Möglichkeit? Der Benutzer sollte es eigentlich nicht mitbekommen wenn tasten an die console gesendet werden. ciao, moin339 |
Re: key an console senden 2
Hallo
Du könntest
Delphi-Quellcode:
durch ersetzen
IF indent = 0 THEN
BEGIN Setforegroundwindow(aWnd); sleep(200); END;
Delphi-Quellcode:
allerdings muß das Fenster natürlich gefunden werden, sonst
IF indent = 0 THEN
WHILE NOT Setforegroundwindow(aWnd) DO BEGIN Application.ProcessMessages; END; gibt es eine Endlosschleife. Als eleganten Zusatz (und zur Sicherheit!) kannst Du z.B. die Schleife ja nach ca. 750ms oder so abbrechen ... Bedenke, der Fokus Deiner App verschwindet trotzdem solange, bis das Fenster durch Setforegroundwindow gesetzt wurde. Auszug aus dem PSDK: Zitat:
|
Re: key an console senden 2
Ein (wenn auch kurzes) blinken kann ich also nicht verhindern. Habe es gerade mal ausprobiert.
Zur not nehme ich das in Kauf aber das sieht nich gerade schön aus. Kennt noch jemand anders eine Lösung tasten an eine Console zu senden ciao, moin339 |
Re: key an console senden 2
... ich weiss nicht,ob es für deine Zwecke geeignet ist, aber guck dir mal die Komponente fpiette an....
...damit kann man sogar ganze Befehle zur Konsole schicken... P.S.; ...es ist auch Freeware, such mal in Google "fpiette"... :coder: |
Re: key an console senden 2
Moin!
Hast du einen link? Ich habe unter google nur einige Netzwerkkomponenten gefunden. ciao, moin339 :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz