Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi key an console senden 2 (https://www.delphipraxis.net/7183-key-console-senden-2-a.html)

moin339 4. Aug 2003 18:49


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:
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;
Aber es passiert leider auch nichts :(

Kennt ihr eine andere (funktionierende) Lösung?

ciao, :?: moin339 :?:

APP 4. Aug 2003 20:47

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:
EnumChildren(FindWindow(NIL, pchar('C:\windows\system32\cmd.exe')));
anpassen.
Und natürlich den zu sendenden Text:
Delphi-Quellcode:
SendText('Test '+wclass);   // Hier kannst Du schreiben!

moin339 4. Aug 2003 21:39

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 :?:

APP 5. Aug 2003 11:30

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;

moin339 5. Aug 2003 11:34

Re: key an console senden 2
 
*versteck*

ok werde ich gleich noch mal probieren.

ciao, :oops: moin339 :oops:

moin339 5. Aug 2003 12:00

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

APP 5. Aug 2003 13:02

Re: key an console senden 2
 
Hallo

Du könntest
Delphi-Quellcode:
IF indent = 0 THEN
BEGIN
  Setforegroundwindow(aWnd);
  sleep(200);
END;
durch ersetzen

Delphi-Quellcode:
IF indent = 0 THEN
WHILE NOT Setforegroundwindow(aWnd) DO
BEGIN
  Application.ProcessMessages;
END;
allerdings muß das Fenster natürlich gefunden werden, sonst
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:

The SetForegroundWindow function puts the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to the window, and various visual cues are changed for the user. The system assigns a slightly higher priority to the thread that created the foreground window than it does to other threads.

Syntax

BOOL SetForegroundWindow( HWND hWnd
);
Parameters

hWnd
[in] Handle to the window that should be activated and brought to the foreground.
Return Value

If the window was brought to the foreground, the return value is nonzero.

If the window was not brought to the foreground, the return value is zero.
...

moin339 5. Aug 2003 13:37

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

Tyrael Y. 13. Aug 2003 11:39

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:

moin339 13. Aug 2003 12:10

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.
Seite 1 von 2  1 2      

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