Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.
Seite 1 von 2  1 2      

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