Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Mi 10.09.08 19:20
Hallo,
ich würde gerne über einen HotKey einen String in die MS DOS Eingabeaufforderung eingeben.
Hierzu habe ich bis jetzt immer Strg+V simuliert, aber das geht ja bekanntlich in einer DOS Box nicht.
Nun suche ich nach einer Möglichkeit, dies doch zu bewerkstelligen. Habt ihr da eine Idee ? Gibt es vielleicht doch eine Tastenkombi dafür ?
Ciao LHUser
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mi 10.09.08 21:42
Erzeuge doch einfach die Console mit createprocess und gib die erforderlichen Parameter mit an!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 10.09.08 22:36
Boldar hat folgendes geschrieben: | Erzeuge doch einfach die Console mit createprocess und gib die erforderlichen Parameter mit an! |
Mhm, das hört sich erst mal schon nach einer Lösung an.
Aber ich möchte gerne dynamisch Texte einfügen können. Also zB. gewisse Pfade usw. Und manchmal auch mehreres in einem DOS Fenster.
Geht so etwas auch ?
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Do 11.09.08 08:12
LonghornUser hat folgendes geschrieben: |
Aber ich möchte gerne dynamisch Texte einfügen können. |
Sollen das immer wiederkehrende gleiche Texte nur in verschiedener Reihenfolge oder grundsätzliche immer andere Texte sein? Für den ersten Fall hätte ich da eine Lösung
_________________ Salus populi suprema lex esto
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 11.09.08 09:18
Wenn du das Handle des Fensters hast, kannst du versuchen eine WM_CHAR Nachricht an selbiges zu schicken. Das sollte funktionieren.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 11.09.08 10:40
maxxdelphisite.free.fr/doscmd.htm
Damit kannst du auch mit einem gestarteten Konsolenprogramm interagieren, wenn dieses Eingaben erwartet.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 11.09.08 12:25
delphi10 hat folgendes geschrieben: | LonghornUser hat folgendes geschrieben: |
Aber ich möchte gerne dynamisch Texte einfügen können. |
Sollen das immer wiederkehrende gleiche Texte nur in verschiedener Reihenfolge oder grundsätzliche immer andere Texte sein? Für den ersten Fall hätte ich da eine Lösung |
Also es soll so laufen, dass man in dem Programm sich unbegrenzt viele Strings etwa in einer Liste anlegen kann, die man dann mit einem Hot Key verknüpft und so schnell oft gebrauchte Strings einfügen kann. Meintest du das mit deiner ersten Variante ?
baka0815 hat folgendes geschrieben: | Wenn du das Handle des Fensters hast, kannst du versuchen eine WM_CHAR Nachricht an selbiges zu schicken. Das sollte funktionieren. |
Das hört sich interessant an. Wo finde ich denn da Informationen, wie man mit WM_CHAR umgeht ?
Hab ich mir gerade geladen, mal schauen,ob ich da was finde.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 11.09.08 12:37
@jaenicke:
Ich habe mir DosCommand einmal geladen und habe den Befehl doscommand1.SendLine('Text',False);
auf einen definierten Hot Key gelegt. Dann habe ich wie gewohnt über Ausführen->cmd die Eingabeaufforderung gestartet und dann F2 gedrückt, aber nichts funktionierte. Leider  Muss man da noch irgendwas vorher machen, damit der Text eingefügt wird ?
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 11.09.08 12:53
Das DOSCommand funktioniert nur bei definierten Kommandos. Du musst der Komponente den Befehl, den du ausführen möchtest, mitgeben.
Also z.B.
Delphi-Quelltext 1: 2: 3:
| DOSCommand.CommandLine := 'C:\Windows\cmd.exe'; DOSCommand.Execute; DOSCommand.SendLine('Text', False); |
Hab's aber nicht getestet.
Was das Senden von WM_CHAR angeht, solltest du im Forum genug Infos finden, guck z.B. mal hier.
|
|
delphi10
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Do 11.09.08 13:22
LonghornUser hat folgendes geschrieben: | Meintest du das mit deiner ersten Variante? |
Ja. Funktioniert ohne Delphi oder anderes Programm. Schreib eine Batch, in der deine Texte mit ECHO ausgegeben werden:
Echo off
Echo Text1
echo Text2
usw.
Starte zwei DOS-Boxen. in der ersten startest du die Text-Batch, ist jetzt deine Textvorlage. In die zweite DOS-Box holst du dir die gewünschten Texte mit Mausselekt und rechter Maustaste rein. Ist zwar primitiv, aber IMO die einzige Möglichkeit unter DOS Crtl.C/Crtl.V nachzuahmen. Mit bzw. unter Delphi gehts natürlich eleganter aber davon stand in deinem Ausgangsposting nichts.
_________________ Salus populi suprema lex esto
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 11.09.08 13:48
LonghornUser hat folgendes geschrieben: | @jaenicke:
Ich habe mir DosCommand einmal geladen und habe den Befehl doscommand1.SendLine('Text',False);
auf einen definierten Hot Key gelegt. Dann habe ich wie gewohnt über Ausführen->cmd die Eingabeaufforderung gestartet und dann F2 gedrückt, aber nichts funktionierte. Leider Muss man da noch irgendwas vorher machen, damit der Text eingefügt wird ? |
Ja, wie baka0815 bereits erläutert hat:
Die Komponente ist dafür da, einen Befehl auszuführen und sowohl die Ausgabe abzufangen (und zu analysieren und ggf. selbst auszugeben) als auch dafür dann Eingaben zu senden.
Beispiel:
Du startest die Kommandozeile, dann sendest du den format Befehl, und wenn die Abfrage zur Bestätigung kommt, sendest du das j. So ist das gemeint.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 11.09.08 13:54
@ baka0815: Dein Vorschlag mit dem DosCommand würde ja bedeuten, dass jedesmal ein neues Dos fenster gestartet werden müsste.
Ich stelle mir das aber eher so vor, dass ich eine einzige Dosbox habe und dann zB. folgendermaßen eintippe:
1.) Zeichenfolge "cd " von Hand eingeben
2.) Über einen HotKey, zB. F2, einen im Programm definierten Text einfügen
Das scheint mit DosCommand nicht zu gehen, oder doch ?
Mehr verspreche ich mir da irgendwie von dem WM_CHAR Event.Ich lese mich da jetzt mal ein und schaue, ob es mich weiterbringt.
@delphi10: Diese Variante ist leider nicht drin, da ich ja eben genau dieses "Von Hand Kopieren" umgehen möchte.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 11.09.08 13:56
LonghornUser hat folgendes geschrieben: | @ baka0815: Dein Vorschlag mit dem DosCommand würde ja bedeuten, dass jedesmal ein neues Dos fenster gestartet werden müsste.
Ich stelle mir das aber eher so vor, dass ich eine einzige Dosbox habe und dann zB. folgendermaßen eintippe:
1.) Zeichenfolge "cd " von Hand eingeben
2.) Über einen HotKey, zB. F2, einen im Programm definierten Text einfügen
Das scheint mit DosCommand nicht zu gehen, oder doch ? |
Doch, genau das macht die Komponente, die Ausgaben musst du ggf. selbst anzeigen, wenn du das willst. Du kannst mit der Komponente auch eine eigene Konsolenbox schreiben. (Sowas habe ich auch gemacht bereits.)
// EDIT:
Ich habe gerade ein kleines Programm gefunden, da habe ich nicht die Komponente verwendet sondern anderen Code, von dem ich leider nicht mehr weiß woher ich den hatte, das Projekt ist etwas älter.
Einloggen, um Attachments anzusehen!
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 11.09.08 15:03
@Jaenicke: Ich schaue mir dein Programm nachher mal an.
@ all:
Ich habe es jetzt mal mit WM_CHAR versucht und bin zu folgendem Code gekommen:
Delphi-Quelltext 1: 2: 3:
| hWordWindow := FindWindowByTitle('Unbenannt - Editor'); if hWordWindow <> 0 then SendMessage(hWordWindow,WM_CHAR,Ord('s'),0); |
Aber leider passiert garnichts. Der Handle wird zwar gefunden, aber das SendMessage hat keinelei Auswirkung
Edit: @jeanicke:
Du hast ja ein komplettes DOS Fenster simuliert. Ich denke, das ist schon etwas zu viel. Ich möchte in bestehende DOS Fenster Text einsetzen.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 12.09.08 13:13
@jaenicke: Vielleicht könnte ich mich mit dieser Lösung doch anfreunden. Nur ein Problem gibt es: Deine DOS Box funktioniert nicht wie eine normale. Wenn ich eine Datei per Kommando öffne (zB. per cd Befehl zum Desktop navigiere und eine Textdatei öffne), kommt es zur Exception. Warum das und wie kann man es beheben ?
@all: Habt ihr keine Idee wegen des WM_CHAR Events ? 
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Fr 12.09.08 13:30
Ich vermute, dass du bei Notepad die WM_CHAR Nachricht nicht an das Notepad-Fenster, sondern an das Memo-Feld im Fenster schicken musst und das Notepad-Fenster den Event einfach verwirft.
edit:
Folgendes funktioniert bei mir bestens:
Delphi-Quelltext 1: 2: 3:
| hWordWindow := FindWindow(nil, 'C:\WINDOWS\system32\cmd.exe'); if hWordWindow <> 0 then SendMessage(hWordWindow, WM_CHAR, Ord('s'), 0); |
In der Kommandozeile steht dann "s" 
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 12.09.08 14:03
Mhm, also vielleicht liegt das an Vista. Aber bei mir geht das definitiv nicht.
Obwohl cmd.exe auch in diesem Verzeichnis liegt (C:\Windows\system32).
Er findet übrigens noch nicht einmal das Handle, was der folgende Code zeigt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var hWordWindow:hwnd; begin hWordWindow := FindWindow(nil, 'C:\Windows\system32\cmd.exe'); if hWordWindow <> 0 then begin showmessage(''); SendMessage(hWordWindow, WM_CHAR, Ord('s'), 0); end; |
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 12.09.08 14:24
Die Kommandozeilenfenster in Vista beinhalten evtl. noch anderen Text, da steht vor "C:\WINDOWS\system32\cmd.exe" z.B. "Administrator", also schau mal nach wie genau die Fensterüberschrift ist. Wenn es das Fenster mit "C:\WINDOWS\system32\cmd.exe" nicht findet muss da was anderes stehen  .
Zur Exception: Zu der Zeit konnte ich noch nicht so gut Delphi glaube ich, der Code ist älter, ich werde mir den mal nochmal anschauen.
Zuletzt bearbeitet von jaenicke am Fr 12.09.08 14:42, insgesamt 2-mal bearbeitet
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 12.09.08 14:36
jaenicke hat folgendes geschrieben: | Die Kommandozeilenfenster in Vista beinhalten evtl. noch anderen Text, da steht vor "C:\WINDOWS\system32\cmd.exe" z.B. "Administrator", also schau mal nach wie genau die Fensterüberschrift ist. Wenn es das Fenster mit "C:\WINDOWS\system32\cmd.exe" nicht findet muss da was anderes stehen .
Zur Exception: Zu der Zeit konnte ich noch nicht so gut Delphi glaube ich, der Code ist älter, ich werde mir den mal nochmal anschauen. |
Ah, stimmt, jetzt geht es.
Aber deine Lösung mit der DOS Box wäre auch noch interessant zu wissen.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 12.09.08 14:42
|
|