Autor |
Beitrag |
bensch
      
Beiträge: 44
|
Verfasst: Do 06.12.07 21:49
hi
ich starte über mein programm eine andere anwendung mit parameterübergabe. dazu habe ich folgenden befehl benutzt:
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','pfad zur exe','textdatei.txt',NIL, SW_HIDE); |
wie kann ich nun der eben gestarteten anwendung einen 2ten parameter übergeben, ohne dass diese nochmal gestartet wird? oder gibt es da einen speziellen befehl, mit dem man ein anderes programm mit mehreren parametern starten kann?
und dann eine 2te frage: das SW_HIDE am ende des befehls sagt doch eigentlich aus, dass dieses aufzurufende programm versteckt gestartet werden soll, oder? denn bei mir öffnet sich die anwendung ganz normal... hab da schon mehrere befehle ausprobiert, zb sw_minimize, aber das funktioniert auch nicht...
würde mich sehr freuen, wenn mir jemand helfen könnte.
mfg bensch
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Fr 07.12.07 01:35
Hallo!
Probier es mal so:
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','pfad zur exe','textdatei.txt textdatei2.txt',NIL, SW_HIDE); |
Wobei das von Programm zu Programm unterschiedlich sein kann wie die Parameter übergeben werden müssen. Einige erwarten die Parameter Komma-separiert, andere wiederum in Anführungszeichen eingeschlossen, ganz andere nehmen die Parameter so entgegen wie oben gezeigt, dann gibt es noch welche die nur einen Parameter berücksichtigen. Musst Du halt ausprobieren.
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 13:09
Dunkels Methode geht problemlos. Unterscheiden kannst Du mit "Paramstr"
Delphi-Quelltext 1: 2: 3:
| if (Paramstr(1) = 'Parameter1') and (Paramstr(2) = 'Parameter2') and (Paramstr(3) = 'Parameter3') then |
Bezüglich "Fehlverhalten" - Versuch's mal mit ShellExecute.
Zitat dsdt.info:
Zitat: | Mit ShellExecute können Sie Dateien und Dokumente ausführen bzw. öffnen. Falls die angegebende Datei keine ausführbare Datei ist, z.B. eine Textdatei (*.txt), so wird das Programm welches mit dem Dateityp verknüpft ist gestartet. ShellExecute ist auch in der Lage Verknüpfungen auszuführen (*.lnk).
Informationen darüber, welche Aktion letztendlich ausgeführt wird, holt sich die Funktion aus der Registry. Sollten Sie versuchen ausführbare Dateien zu starten, verwenden Sie anstatt ShellExecute besser CreateProcess. Früher wurde auch häufig auf die Funktion WinExec verwiesen. Diese Funktion ist aber inzwischen veraltet und es besteht die Gefahr, dass diese in zukünftigen Windows-Versionen nicht mehr funktionieren wird.
Hier ein Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); begin if ShellExecute(Application.Handle, 'open', PChar('C:\index.html'), Nil, Nil, SW_NORMAL) <= 32 then ShowMessage('Es ist ein Fehler aufgetreten'); end; |
|
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 15:55
gut, danke euch beiden. ich werd das heute nachmittag mal probieren.
könnt ihr mir bezüglich der 2ten frage auch helfen?
bensch hat folgendes geschrieben: |
und dann eine 2te frage: das SW_HIDE am ende des befehls sagt doch eigentlich aus, dass dieses aufzurufende programm versteckt gestartet werden soll, oder? denn bei mir öffnet sich die anwendung ganz normal... hab da schon mehrere befehle ausprobiert, zb sw_minimize, aber das funktioniert auch nicht... |
wenn ich da wiederum den wert sw_maximize angebe, wird die anwendung maximiert gestartet. warum funktioniert das nicht mit sw_minimize oder sw_hide?
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Fr 07.12.07 16:04
bensch hat folgendes geschrieben: | wenn ich da wiederum den wert sw_maximize angebe, wird die anwendung maximiert gestartet. warum funktioniert das nicht mit sw_minimize oder sw_hide? |
Wahrscheinlich funkt Dir da das aufgerufene Programm dazwischen. Es wird zwar dazu angehalten minimiert zu starteten, beim Auswerten der Parameter (z.B. lade Dokument X) setzt es sich wahrscheinlich automatisch in den Vordergrund.
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 16:26
hm, kann eigentlich nicht sein, denn wenn ich das programm manuell starte, und die textdatei laden lasse, kann ich es minimieren, ohne dass es sich wieder aufpoppt. ich hab hier im forum auch schon rumgesucht, und da hatte ein user das gleiche problem. nämlich dass sw_hide nichts bewirkt hat. gibts da eventuell noch andere möglichkeiten, ein laufendes programm vom vordergrund sozusagen unsichtbar zu machen? sprich, den task aus der taskleiste entfernen und das programm minimieren?
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 16:48
bensch hat folgendes geschrieben: | ...und die textdatei laden lasse, kann ich es minimieren, ohne dass es sich wieder aufpoppt... |
Soll also heissen, zuerst startet es im Vollbildmodus - oder?
Somit dürfte dieses Verhalten also normal sein...
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 16:58
das externe programm startet ganz normal, weder minimiert noch maximiert. wenn ich aber auf minimieren klicke, minimiert es sich auch ganz normal. bloß eben über den shellexecute-aufruf lässt es sich nicht minimieren. wenn man es also nicht minimiert starten kann, könnte man ja versuchen, nach dem start das programm zu minimieren bzw. in den sw_hide modus zu setzen. weiß aber nicht, ob das im nachhinein möglich ist...
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Fr 07.12.07 17:05
bensch hat folgendes geschrieben: | wenn man es also nicht minimiert starten kann, könnte man ja versuchen, nach dem start das programm zu minimieren bzw. in den sw_hide modus zu setzen. weiß aber nicht, ob das im nachhinein möglich ist... |
Hol Dir das Handle der gestarteten Anwendung und sende eine entsprechende Nachricht an das Fenster.
Du solltest einiges zu diesen Themen hier im Forum finden. FINDWINDOW & POSTMESSAGE sollten Dir weiterhelfen.
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 18:29
bensch hat folgendes geschrieben: | hm, kann eigentlich nicht sein, denn wenn ich das programm manuell starte, und die textdatei laden lasse, kann ich es minimieren, ohne dass es sich wieder aufpoppt. |
Das Programm wird in diesem Falle ja auch nicht neu gestartet, sondern es wird lediglich das Dokument geöffnet.
bensch hat folgendes geschrieben: | gibts da eventuell noch andere möglichkeiten, ein laufendes programm vom vordergrund sozusagen unsichtbar zu machen? sprich, den task aus der taskleiste entfernen und das programm minimieren? |
Hat mit der eigentlichen Fragestellung eigentlich nichts mehr zu tun (Taskmanager) und ist eine andere Baustelle.
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 20:17
so, hab die vorschläge nun getestet. funktionieren leider nicht
also zuerst zum programm mit parameter starten:
wenn ich dem programm mehrere parameter mit einem mal übergebe, kommt in diesem externen programm die fehlermeldung: Datei existiert nicht! ich müsste also erst das programm mit einfacher parameterübergabe starten, und dann später noch eine text-datei übergeben.
in diesem externen programm befindet sich ein opendialog, mit dem man die textdatei auswählen kann. ich müsste also irgendwie das handle des externen programmes bekommen, und muss dem opendialog eine textdatei übergeben.
da wären wir aber beim 2ten problem:
ich hab folgenden code probiert:
Delphi-Quelltext 1: 2:
| WindowHandle:=FindWindow(nil,'Fenstertitel'); postmessage(WindowHandle,WM_close,0,0); |
ich wollte probieren, ob ich den fensterhandle der externen anwendung erhalte, und wollte die danach schließen. aber es tut sich beim ausführen meines programmes nichts. ich starte also das externe programm von hand, drücke dann den button der wiederum oben stehenden code ausführt. aber es schließt sich die externe anwendung nicht. nach dem klick auf den button kann ich mein fenster auch nicht mehr schließen, da ich anscheinend das handle auf meine anwendung verloren habe. ich muss dann mein programm per taskmanager beenden...
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 20:50
bensch hat folgendes geschrieben: | wenn ich dem programm mehrere parameter mit einem mal übergebe, kommt in diesem externen programm die fehlermeldung: Datei existiert nicht! ich müsste also erst das programm mit einfacher parameterübergabe starten, und dann später noch eine text-datei übergeben. |
Wenn das externe Programm nicht von Dir stammt, wird es schon so sein wie Du schreibst. Ob ein 2. oder 3. Parameter korrekt ausgewertet wird hängt schliesslich vom Programmierer ab.
Das starten des Programm mit NUR EINEM Parameter (Datei) klappt nicht (?)
(oder nur nicht, wenn mehrere Parameter übergeben werden?)
bensch hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| WindowHandle:=FindWindow(nil,'Fenstertitel'); postmessage(WindowHandle,WM_close,0,0); |
|
Du musst nur das Handle wieder umbiegen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); begin WindowHandle:=FindWindow(nil,'Dokument2 - Microsoft Word'); postmessage(WindowHandle,WM_close,0,0); WindowHandle:=FindWindow(nil,'Form1'); end; |
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
Zuletzt bearbeitet von Blawen am Fr 07.12.07 20:52, insgesamt 2-mal bearbeitet
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Fr 07.12.07 20:51
bensch hat folgendes geschrieben: |
wenn ich dem programm mehrere parameter mit einem mal übergebe, kommt in diesem externen programm die fehlermeldung: Datei existiert nicht! ich müsste also erst das programm mit einfacher parameterübergabe starten, und dann später noch eine text-datei übergeben.
|
Ist das externe Programm von dir? Also, hast du die Quelltexte?
Hast du mal via "Ausführen..." oder über CMD ausprobiert ob das Programm überhaupt mehrere Dateien haben will?
Wenn nicht, musst du dir was anderes überlegen. Wenn es dort aber geht machst du was falsch.
bensch hat folgendes geschrieben: |
ich wollte probieren, ob ich den fensterhandle der externen anwendung erhalte, und wollte die danach schließen. aber es tut sich beim ausführen meines programmes nichts. ich starte also das externe programm von hand, drücke dann den button der wiederum oben stehenden code ausführt. aber es schließt sich die externe anwendung nicht. nach dem klick auf den button kann ich mein fenster auch nicht mehr schließen, da ich anscheinend das handle auf meine anwendung verloren habe. ich muss dann mein programm per taskmanager beenden... |
Wenn du sowas tust:
Delphi-Quelltext 1: 2:
| WindowHandle:=FindWindow(nil,'Fenstertitel'); postmessage(WindowHandle,WM_close,0,0); |
Dann solltest du vor dem PostMessage auch prüfen ob due überhaupt ein Handle bekommen hast:
Delphi-Quelltext 1: 2: 3:
| WindowHandle := FindWindow(nil,'Fenstertitel'); if WindowHandle <> 0 then postmessage(WindowHandle,WM_close,0,0); |
WindowHandle ist selbstverständlich eine lokale Variable vom Typ Integer.
Auf keinen Fall solltest du mit dem WindowHandle deines Fensters arbeiten!
Und dazu sein noch gesagt, dass an die Stelle von "Fenstertitel", der Text hin muss den das Programm im Titel hat was du erwischen willst.
Die Win SDK Hilfe sagt dazu : "Points to a null-terminated string that specifies the window name (the window's title)"
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 21:31
Blawen hat folgendes geschrieben: |
Das starten des Programm mit NUR EINEM Parameter (Datei) klappt nicht (?)
(oder nur nicht, wenn mehrere Parameter übergeben werden?) |
das starten mit einem parameter funktioniert bestens, nur mit 2 funktionierts nicht. und da das externe prog nicht von mir ist, kann ich da leider auch nicht im quelltext rumpfuschen
Sinspin hat folgendes geschrieben: |
Hast du mal via "Ausführen..." oder über CMD ausprobiert ob das Programm überhaupt mehrere Dateien haben will?
Wenn nicht, musst du dir was anderes überlegen. Wenn es dort aber geht machst du was falsch. |
habs grad über cmd versucht, da nimmts auch nur einen parameter an...
Sinspin hat folgendes geschrieben: |
Wenn du sowas tust:
Delphi-Quelltext 1: 2:
| WindowHandle:=FindWindow(nil,'Fenstertitel'); postmessage(WindowHandle,WM_close,0,0); |
Dann solltest du vor dem PostMessage auch prüfen ob du überhaupt ein Handle bekommen hast:
Delphi-Quelltext 1: 2: 3:
| WindowHandle := FindWindow(nil,'Fenstertitel'); if WindowHandle <> 0 then postmessage(WindowHandle,WM_close,0,0); |
WindowHandle ist selbstverständlich eine lokale Variable vom Typ Integer. |
achso, ich hab WindowHandle als THandle deklariert. aber selbst wenn ich es als integer deklariere, schließt sich die andere anwendung nicht.
edit: an der stelle wo ich im quelltext oben 'Fenstertitel' stehen hab, habe ich im programm den korrekten fenstertitel der externen anwendung angegeben, der scheint aber das fenster nicht zu finden...
hab auch versucht, das handle über den exe-namen der anwendung zu erhalten, funzt auch nicht 
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 21:41
bensch hat folgendes geschrieben: | Das starten des Programm mit NUR EINEM Parameter (Datei) klappt nicht (?)
(oder nur nicht, wenn mehrere Parameter übergeben werden?)
das starten mit einem parameter funktioniert bestens, nur mit 2 funktionierts nicht. und da das externe prog nicht von mir ist, kann ich da leider auch nicht im quelltext rumpfuschen |
Somit kannst Du mehrere Parameter schlicht vergessen. Was nicht vorgesehen ist, kannst Du auch nicht nutzen!
bensch hat folgendes geschrieben: |
Wenn du sowas tust:
Delphi-Quelltext 1: 2:
| WindowHandle:=FindWindow(nil,'Fenstertitel'); postmessage(WindowHandle,WM_close,0,0); |
Dann solltest du vor dem PostMessage auch prüfen ob du überhaupt ein Handle bekommen hast:
Delphi-Quelltext 1: 2: 3:
| WindowHandle := FindWindow(nil,'Fenstertitel'); if WindowHandle <> 0 then postmessage(WindowHandle,WM_close,0,0); |
WindowHandle ist selbstverständlich eine lokale Variable vom Typ Integer.
achso, ich hab WindowHandle als THandle deklariert. aber selbst wenn ich es als integer deklariere, schließt sich die andere anwendung nicht.
edit: an der stelle wo ich im quelltext oben 'Fenstertitel' stehen hab, habe ich im programm den korrekten fenstertitel der externen anwendung angegeben, der scheint aber das fenster nicht zu finden...
hab auch versucht, das handle über den exe-namen der anwendung zu erhalten, funzt auch nicht  |
Hast Du meinen Tipp beachtet? Bei mir funktioniert es problemlos (auch wenn die Handle-Überprüfung fehlt...)
Somit dürfte die Lösung in der Verschmelzung der beiden Tipps liegen.
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 21:50
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 07.12.07 21:58
bensch hat folgendes geschrieben: | jetzt versuch ich das korekte handle von der externen anwendung zu erhalten, um den darin vorkommenden opendialog die textdatei zu übergeben. aber ich scheitere ja am handle der externen anwendung  |
Ich habe es in meinem Fall mit Word versucht und es hat problemlos geklappt. Somit wird Dein verwendeter Fenstername falsch sein.
Beachte, dass ich in meinem Fall das Fenster mit dem Dokument 2 geschlossen habe. Beim Dokument 1 würde es also so aussehen:
Delphi-Quelltext 1:
| WindowHandle := FindWindow(nil,'Dokument1 - Microsoft Word'); |
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Fr 07.12.07 23:12
so, jetzt hab ich das fensterhandle. der entwickler der externen anwendung hat hinter dem fenstertitel einige leerzeichen angehängt, deswegen hab ich am anfang kein handle bekommen.
da ich jetzt das handle habe, könnte ich ja eigentlich dem opendialog der sich öffnet, wenn ich auf den button "Container laden" drücke, eine datei übergeben, oder?
hier ein ausschnitt der externen anwendung:
oder kann ich gar nicht auf den opendialog zugreifen, der sich hinter diesem button verbirgt?
schonmal ein großes dankeschön, dass ihr mir bis hierher geholfen habt 
Zuletzt bearbeitet von bensch am Fr 21.12.07 23:21, insgesamt 1-mal bearbeitet
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Sa 08.12.07 07:00
bensch hat folgendes geschrieben: | oder kann ich gar nicht auf den opendialog zugreifen, der sich hinter diesem button verbirgt? |
Prinzipiel geht es sicherlich. Lade Dir das Programm XSpy (heisst es so?!) runter, besorge Dir damit das Handle des Buttons und "drücke" diesen via Messages.
btw.: "Container laden" hört sich für mich nicht nach einem "Container hinzufügen" an. Du möchtest doch immer noch 2-n Datein öffnen - bist Du Dir sicher dass das überhaupt mit dieser Applikation geht?
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
bensch 
      
Beiträge: 44
|
Verfasst: Sa 08.12.07 15:49
ja, das geht. ich starte das programm mit dem code
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open','pfad zur exe','textdatei.txt',NIL, SW_HIDE); |
und versuch dann später eben nochmal eine datei über den opendialog zu laden. wenn ich es manuell mache, funktioniert es zumindest...
das mit xspy werde ich versuchen, danke!
|
|
|