Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Shellexecute die tausendste (https://www.delphipraxis.net/28984-shellexecute-die-tausendste.html)

Ati 2. Sep 2004 09:03


Shellexecute die tausendste
 
Liste der Anhänge anzeigen (Anzahl: 2)
Mahlzeit Leute,
ich möchte ein externes Programm mit folgendem Befehl starten
Delphi-Quellcode:
shellexecute(application.Handle,nil,PChar('D:\Pathworks\powerterm\pt525.exe'),nil,nil,SW_Shownormal);
Dies funktioniert jedoch nicht so als wenn ich das normal von Hand starte. Ich habe mal zwei Screenshots gemacht, damit ihr den Unterschied sehen könnt. Shell1 ist das normale Startbild wenn ich das Programm über eine Verknüpfung starte. Shell2 ist das Startbild bei meiner Delphi-Version. Vielleicht kann mir ja mjemand helfen da die Suche diesbezüglich nichts gebracht hat.

Ati

Shaman 2. Sep 2004 09:07

Re: Shellexecute die tausendste
 
Hoi

Übergibt die Verknüpfung vielleicht noch irgendwelche Parameter?

Gruss
Shaman

Ati 2. Sep 2004 09:17

Re: Shellexecute die tausendste
 
Nicht das ich wüßte. Selbst wenn ich über den Explorer in das Verzeichnis reingehe und die EXE per doppelklick starte kommt das ganz normale Startbild (shell1)

Vjay 2. Sep 2004 11:02

Re: Shellexecute die tausendste
 
Übergib mal ShellExecute den Working-Path der Anwendung.

S2B 2. Sep 2004 11:25

Re: Shellexecute die tausendste
 
Versuch mal das, vielleicht bringt das was:
Delphi-Quellcode:
shellexecute(application.Handle,'open',PChar('D:\Pathworks\powerterm\pt525.exe'),nil,nil,SW_Shownormal);

silentAMD 2. Sep 2004 12:15

Re: Shellexecute die tausendste
 
hi,

lösungsmöglichkeiten:

a.) trenne mal den pfad vom dateinamen:

ShellExecute(Application.Handle, nil, PChar('pt525.exe'), nil, PChar('D:\Pathworks\powerterm\'), SW_NORMAL);

b.) schreibe chdir('D:\Pathworks\powerterm\') vor dem shellexecute befehl



das gleiche problem hatte ich nämlich auch (beim öffnen des hauptmenüs der gamestar-dvd) da sind die grafiken nicht geladen :cry:


mfg

Ati 2. Sep 2004 14:17

Re: Shellexecute die tausendste
 
Danke Silent. Lösung a war richtig. dann kann ich mich ja jetzt damit beschäftigen, wie ich dem Programm Strings schicken kann.
Vielen Dank nochmal

Ati 3. Sep 2004 13:30

Re: Shellexecute die tausendste
 
So meine Herren ich möchte dann jetzt auch mal mit unwissenheit glänzen ;-)
Ich möchte das gestartete Programm ja fernsteuern. Man hat mir mal als Tip was von TClipboard gesagt kann damit jedoch nichts anfangen. Also habe ich mir Sendmessage, FindWindow etc. angeschaut. Ich schaffe es also bisher das Programm zu starten und kann auch die Proc-ID auslesen. Wenn ich jetzt also einen String an das Programm schicken will, es handelt sich hierbei um eine Terminalemulation, ändere ich auf einmal den Titel des Fensters :gruebel: . Damit alle auch mal herzhaft lachen können stell ich mal meinen Quelltext rein.
Anmerkung: Viele sachen sind eigentlich Überflüssig ich mache es jedoch um nitr diverse Sachen anzeigen zu lassen.
Delphi-Quellcode:
unit mainu;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,shellapi;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);



  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
function EnumWindowsProc(const hWnd : word; Param: lParam): LongBool; stdcall;
var

  Buffer: array[0..1024] of Char;
begin
  Result := True;
  GetWindowText(hWnd, Buffer, sizeof(Buffer));
  if lstrlen(Buffer) = 0 then
   begin
    exit;
   end
  else
   begin


   Form1.Memo1.Lines.Add (buffer);


   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Application.Handle, nil, PChar('pt525.exe'), nil, PChar('D:\Pathworks\powerterm\'), SW_NORMAL);
end;

procedure TForm1.Button2Click(Sender: TObject);
var

LPARRAM : DWord;
begin

EnumWindows (@EnumWindowsProc,Integer(@LPARRAM));
end;

procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
for i := 0 to form1.Memo1.Lines.Count-1 do
   form1.Memo1.Lines.Delete(i);
end;

procedure TForm1.Button4Click(Sender: TObject);
var procid:hwnd;
    s:string;
begin
if findwindow(nil,'(A) LAT (KFO) - PowerTerm 525')<>0 then
begin
s:='start';
showmessage('Läuft!!') ;
procid:=findwindow(nil,'(A) LAT (KFO) - PowerTerm 525');
showmessage('Proc-ID= '+inttostr(procid));
SendMessage(procid, WM_SETTEXT, 0, Integer(@s[1]));
end
else
Showmessage('Läuft nicht');


end;

end.
Hilfe wäre echt nett.

Ati

Dax 3. Sep 2004 14:49

Re: Shellexecute die tausendste
 
Such doch mal im Web nach Bei Google suchenSendKeys Ken Henderson.
Das ist eine Unit, die an ein Fenster mit bestimmtem Name Tastendrücke senden kann.

Oder du sendest jeden Buchstaben einzeln mit keybd_event(). Dazu muss das Fenster, das die Tastendrücke erhalten soll, aber erst in den Vordergrund.

TStringlist 3. Sep 2004 19:24

Re: Shellexecute die tausendste
 
@Ati

...Warum sich auf einmal der Titel des Fensters änderte? Weil das nunmal eben auch eine ganz normale Funktion einer WM_SetText -Message ist.

Anstatt den Fenster-Title auszulesen (so wie du das ja mit der von dir in 'EnumWindowsProc' benutzten Api-Funktion "GetWindowText" getan hast), wird ein solcher Titel durch diese Message jetzt also beschrieben bzw. geladen .....immer vorausgesetzt: Die Message-Handle identifiziert auch jeweils ein echtes Programm-Fenster!!! Identifiziert diese Message-Handle jedoch z.B. nur ein TEdit-Control, dann wird anstelle des hier nicht vorhandenen Titles jetzt dafür aber dessen Text-Property geladen...

...Im Falle deines Progs könntest du also nun ein solches TEdit-Control (auch unsichtbar) auf deine Form packen und zu diesem dann jeweils irgendwelche Kommando-Strings hinschicken. Im OnChange-Eventhandler dieses TEdits könntest du dann anschließend auf dort ankommende Kommandos reagieren.

Ati 4. Sep 2004 10:20

Re: Shellexecute die tausendste
 
mmmh. Ich habe mich für SENDKEYS entschieden. Habe das mal mit notepad.exe getestet und es funktioniert. Wenn ich jetzt meine Emulation starte funktioniert es jedoch nicht. Darauf kann ich mir kein Reim machen. Habe es schon mit einem kleinen sleep-Befehl zwischen Shellexecute und Sendkeys probiert, es half aber nichts.

Ati 4. Sep 2004 10:34

Re: Shellexecute die tausendste
 
Es funktioniert doch. Ich mußte nur ein bischen mit SLEEP fummeln und jetzt klappt es erstmal. Bei weiteren Problemen werd ich Euch dann schon wieder nerven ;-)

Ati 4. Sep 2004 10:48

Re: Shellexecute die tausendste
 
Tja zu früh gefreut. Wenn ich Zahlen an die Emulation schicken möchte, so werden die nicht angenommen. So erscheint statt "DIH220" nur "DIH". Wie kann man das denn umgehen??

Dax 4. Sep 2004 11:18

Re: Shellexecute die tausendste
 
Versuch mal, den zweiten Parameter von der (von mir empfohlenen) Sendkeys-Unit auf true zu setzen. Dann wartet die Unit nämlich mit dem nächsten Tastendruck, bis der letzte verarbeitet wurde.

Ati 4. Sep 2004 15:45

Re: Shellexecute die tausendste
 
Sorry Dax. Ich hatte mir eine andere Sendkeys-Unit runtergeladen. Habe diese natürlich jetzt auf meinem Compi in der Firma. Ich weiß nur das man bei dieser Variante nur folgendes eiingeben muß: sendkeys('test');
und schon wird alles geschickt. Ich werde mir aber auch mal Deine Variante anschauen, vielleicht klappt es ja damit.

Ati 6. Sep 2004 08:06

Re: Shellexecute die tausendste
 
Sooooo Ich habe mich nochmal in das Thema eingelesen und es kann eigentlich nichts mit meiner Sendkeys-Unit zu tun haben. Zumal meine Vareiante auch Zahlen an das Programm Notepad.exe sendet. Es muß also mit der Emulation zu tun haben. Ich habe auch schon sämtliche Knvetrtierungen versucht (z.B. strtoint) aber auch damit hatte ich bisher keinen Erfolg. Bin demnach für jede Idee oder Vorschlag dankbar

Ati 7. Sep 2004 13:20

Re: Shellexecute die tausendste
 
Um die Verwirrung perfekt zu machen, habe ich etwas gefunden was funktioniert. Ich kann mir keinen Reim darauf machen aber vielleicht einer von Euch.
Delphi-Quellcode:
KEYBD_EVENT(VK_Numpad3,0,0,0);
Wie gesagt kann ich damit Zahlen an die Emulation schicken aber mit Sendkeys nicht :gruebel: :gruebel: :gruebel: :gruebel: :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz