Entwickler-Ecke

Windows API - Problem mit FindWindow/ShellExecute


pHaRyNx - Do 27.03.08 20:04
Titel: Problem mit FindWindow/ShellExecute
hallo.

ich habe leider ein problem. ich hab hier schon gesucht, aber nichts gefunden, was in diese richtung geht. deshalb hier das problem:
ich übergebe via shellexecute einen befehl an eine datei. diese für diesen befehl aus (das dauert ein paar sekunden) und dann schließt sich die datei automatisch wieder.

hier der aufruf (etwas vereinfacht):

Delphi-Quelltext
1:
ShellExecute(Application.Handle,'open',pCHAR('lame.exe'),PCHAR('-- parameter'),nil,SW_SHOW);                    


jetzt möchte ich überprüfen, wann sich diese date wieder schließt, um den nächsten befehl zu übergeben. als hobbyprogrammierer ;) hab ich natürlich einen timer genommen, der alle 2 sekunden überprüft, ob sich die datei schon geschlossen hat.
sieht ungefähr so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False;
if FindWindow(NIL,PCHAR('c:\ordner\lame.exe'))=0 then naechsterbefehl...;
// c:\ordner\lame.exe steht in der titelleiste der ausgeführten datei


das klappt leider nicht. ich hab ehrlich gesagt schon etwas rumgetüftelt und bei einer früheren programmversion hats auch so oder ähnlich geklappt. ich weiß leider nicht mehr wie und die alte version hab ich verloren :(

weiß jemand, wie ich überprüfen kann, ob sich die datei lame.exe geschlossen hat ???

ich wäre euch sehr dankbar, wenn ihr mir helfen könntet.

mfg pHaRyNx


Narses - Do 27.03.08 20:07

Moin!

Ich würde das anders machen: Den Prozess mit CreateProcess starten und dann das Handle prüfen. Suche in: Delphi-Forum, Delphi-Library STARTEN PROGRAMM ENDE WARTEN :idea:

cu
Narses


pHaRyNx - Do 27.03.08 20:38

mh, ok, danke. ich habe mir jetzt diese prozedur gestohlen :D : http://www.delphi-library.de/viewtopic.php?t=15943

schön und gut, klappt auch mit den parametern übergeben, und dem warten. aber die anwendung, die jetzt geöffnet wird, wird nur oben links ganz klein angeizeigt, sodass man den fensterinhalt nicht sehen kann. kann man das irgendwie ändern, dass das fenster in normalgröße wie immer angezeigt wird ?

EDIT
gibt es keine möglichkeit, das mit findwindow zu machen ? ich blick bei der prozedur oben nicht durch und hab auch so gut wie keine erfahrung mit api-programmierung.
na, also ich hab ne möglichkeit gefunden mit SW_Maximized kann man das fenster groß anzeigen (ist zwar was hässlich, aber egal.) aber der fensterinhalt des eigentlichen programms scheint hierbei eingefroren zu sein...

EDIT 2
loool, was ist das denn????!!! jetzt gehts auf einmal mit findwindow (aber nur weil ich das programm 2mal geöffnet hatte)

EDIT 3
ohhh, jetzt gehts wieder nicht, was soll das denn ??!?!?!?!??1111


Dezipaitor - Fr 28.03.08 17:14

du kannst auch ShellExecuteEx [http://msdn2.microsoft.com/en-us/library/bb762154.aspx] verwenden und dann auf den Prozess warten. Die Funktion liefert das Prozesshandle in hProces zurück. Einfach WaitForSingleObject damit verwenden.


pHaRyNx - Sa 29.03.08 17:30

danke für den tipp. es funktioniert jetzt aber auch mit findwindow. ich hatte anderweitig einen fehler im quelltext.
danke für euere hilfe. ihr habt mir trotzdem geholfen.

mfg pHaRyNx