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/)
-   -   Auf das Schließen eines Explorer-Fensters warten (https://www.delphipraxis.net/162639-auf-das-schliessen-eines-explorer-fensters-warten.html)

blablab 31. Aug 2011 22:31

Auf das Schließen eines Explorer-Fensters warten
 
Hallo!

Ich möchte gerne ein neues Explorer-Fenster mit einem bestimmten Pfad öffnen und dann darauf reagieren, wenn dieses Fenster geschlossen wird. Das Starten des Explorers mit einem bestimmten Pfad habe ich jetzt auf zwei Arten erfolgreich ausprobiert: ShellExecuteEx und CreateProcess.

ShellExecuteEx liefert für hProcess immer 0 (das ist nur beim explorer der Fall, bei anderen Programmen funktioniert das).
Und bei CreateProcess bekomme ich zwar einen Wert hProcess <> 0 , aber
Delphi-Quellcode:
WaitForSingleObject(hProcess, INFINITE);
kehrt sofort mit dem Rückgabewert WAIT_FAILED zurück.

Ich glaube ich verstehe warum es nicht funktioniert: Wenn ich ein normales Programm öffne, so wird ein neuer Prozess gestartet, der dann auch im Taskmanager auftaucht. Beim Explorer allerdings ist immer nur eine Instanz "explorer.exe" gestartet. Es wird nur ein weiteres Explorer-Fenster geöffnet, das dem bereits existierenden Prozess "explorer.exe" hinzugefügt wird. Mein neu gestarteter Explorer-Prozess wird wahrscheinlich sofort wieder geschlossen oder erst gar nicht gestartet.

Aber selbst wenn das die richtige Erklärung ist, weiß ich leider keine Lösung...
Theoretisch könnte ich mit
Delphi-Quellcode:
FindWindow()
nach einem Fenster mit dem Pfadname als Titel suchen und dann auf dessen Beendung reagieren. Allerdings könnten ja mehrere Explorer-Fenster mit diesem Pfad geöffnet sein und da wäre es mir lieber ich könnte irgendwie mit hProcess oder Ähnlichem arbeiten um sicherzugehen dass ich das richtige Fenster/den richtigen Prozess beobachte.

Vielen Dank schonmal für eure Hilfe!

Grüße
blabla

DeddyH 1. Sep 2011 07:33

AW: Auf das Schließen eines Explorer-Fensters warten
 
Nur eine Idee, noch dazu eine etwas umständliche: ermittle doch zuerst alle Fenster, die zum Prozess "explorer" gehören, und merk sie Dir in einer Liste. Nun rufst Du den Explorer auf und ermittelst das Fenster, das vorher nicht in der Liste war. Falls der Explorer dafür einen neuen Thread startet (ich weiß es nicht, vermute dies aber), kannst Du diesen dann ermitteln und auf dessen Ende warten.

CCRDude 1. Sep 2011 09:07

AW: Auf das Schließen eines Explorer-Fensters warten
 
Ob Explorer neue Fenster in neuen Prozessen startet oder nicht, ist eine Einstellungssache. Dreckig aber machbar wäre es, HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Explorer\Advanced\SeparateProcess temporär auf 1 und danach wieder auf den alten Wert zurückzusetzen.

DeddyHs Methode klingt etwas sauberer, auch wenn ich vom Prinzip her (oder ist das nur nach Gefühl? ;) ) auch das Prozess-Handle bevorzugen würden.

blablab 1. Sep 2011 16:24

AW: Auf das Schließen eines Explorer-Fensters warten
 
Ich bin am überlegen ob ichs so wie in DeddyHs Vorschlag mache. Aber dazu hätte ich eine weitere Frage:
Wie ist der Klassenname eines Explorer-Fensters?

Bei mir ist es scheinbar "CabinetWClass" allerdings frage ich mich ob das immer der Fall ist. Ich benutze XP, ist der Klassenname unter Vista oder Win7 vielleicht ein anderer...?

CCRDude 2. Sep 2011 08:54

AW: Auf das Schließen eines Explorer-Fensters warten
 
Entweder Du probierst das selber mit EnumWindows aus, oder Du nutzt sowas fertiges wie WinSpy++. Gibt da etliche :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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