Witam
a klopot polega na tym, ze prawdopodobnie masz zly uchwyt do programu.
...zapewniam po raz drugi że nie dawałbym pytania bez uprzedniego sprawdzenia uchwytu
Dzięki za kod. Przetestowałem i rzeczywiście to działało no i pomogło mi
w odnalezieniu prawdziwego powodu błędnego działania:
var
H : Hwnd;
begin
H := FindWindow('TForm1', nil);
PostMessage(H, WM_QUIT, 0, 0);
//- A
Sleep(5000);
//- B
MessageBox(0,'ok','',0);
end.
zamknięcie następuje w miejscu A, ale:
mój błąd bo nie podałem wszystkich okoliczności, przepraszam...
a więc ten mały program
jest uruchamiany przez WinExec() z Aplikacji, która ma być właśnie przez
niego zamknięta. W takim wypadku zamknięcie zostaje zrealizowane w miejscu B.
Ktoś wie dlaczego ?
BTW:
no i wtedy kod dzialal tak jak u Ciebie, czyli sam zamykał siebie po 5 sekundach
w tym przypadku FindWindow() zwraca 0, no i rzeczywiście
PostMessage(0, WM_QUIT, 0, 0) powoduje zamknięcie samego siebie
ale dlaczego ? mógłbym to sobie wytłumaczyć tak że 0 reprezentuje
uchwyt do samego siebie, ale program bez WindowsProcedure (WndProc)
nie może odbierać komunikatów więc skąd to się bierze ?
Wracając do tego błędu, to uporałem się ;-)
Skorzystałem z ShellExecute() ;-)
ale mam pytanie dodatkowe:
Jak sprawdzić czy program jest uruchomiony czy też
nie i można do niego zapisywać, IsWindow() się nie
sprawdza bo po WM_QUIT nie ma już okna ale program
jest jeszcze przez chwilę używany przez system,
jak to sprawdzić ?
bo jedyne co mi przychodzi do głowy to robić AssignFile
i patrzeć czy się wysypie ale może jest jakiś bardziej
elegancki sposób ?