explorer
-
Danke.
Genau sowas habe ich gesucht.
-
Der umgekehrte Weg geht auch?
Wenn ich eine Prozess-ID habe und alle "Window Handles" des Prozesses haben möchte.
Als Beispiel: Alle "Window Handles" vom Prozess "explorer.exe" herausfinden.
Wie geht das??
-
Nein, das geht nicht so direkt. Dazu musst du einen kleinen Umweg machen und mit EnumWindows alle Fenster durchgehen und für jedes dann mit GetWindowThreadProcessId prüfen, ob es zum zu untersuchenden Prozess gehört

-
rewe schrieb:
Wennn ich mache:
"START"->"RUN"->"EXPLORER.exe"
Dann kreiert mir Windows einen Explorer, der unter dem Prozess "explorer.exe" läuft.
Ich möchte dann den gestarteten Explorer wieder beenden (jedoch nicht den Prozess!!!). Den Prozess abschiessen wäre ja einfach, aber genau das will ich nicht.
Wie mache ich das? Code?Danke und Gruss
Nochmals zur Ursprungs-Frage zurück:
In einem der Links stand dieser Code (nur ein Ausschnitt):
hEditor = FindWindow(NULL, "Unbenannt - Editor"); if(!hEditor) { MessageBox(hwnd, "Fenster nicht gefunden", "ERROR", MB_OK); return; } GetWindowThreadProcessId(hEditor, &pID); wTA = TerminateAppByWindowClosing(pID, 5000);mit FindWindow wird das Notepad-Window gesucht und dann wird das Window mit WM_CLOSE geschlossen.
Das funktioniert auch wunderbar.Nun aber,...
bei mir sieht der Code etwa so aus:HANDLE ProcessHandle = ::CreateProcess("explorer.exe",.........);Nach dieser Zeile poppt ein neues Explorer-Fenster auf mit "My Documents" als Startpfad.
Vielfach gibt es bereits mehr als 1 solches Explorer-Fenster.WIE kann ich nun exakt dieses Window das durch CreateProcess kreiert wurde, wieder finden???
Jetzt sind echte WinAPI-Spezialisten gefragt

-
Lösungansatz:
Direkt nach CreateProcess() möchte ich mir ein Handle zum Explorer-Window beschaffen.
Die einzigen Informationen die ich habe sind:
- Es ist ein Explorer-Window
- es ist das letzt kreierte Explorer-Window
- ... vielleicht habe ich ja noch mehr Informationen, die ich gar nicht kenne.Nun muss ich über alle Windows enumerieren, und dieses Window finden.
Wie?
-
Hat jemand schon eine Idee oder gar eine Lösung??
-
Ich habe doch bereits geschrieben, wie du vorgehen musst. Bei CreateProcess bekommst du über lpProcessInformation unter anderem die Prozess-ID. Wenn du jetzt mit EnumWindows die Fenster durchgehst musst du für jedes die ID gegen diese Prozess-ID checken.
Außerdem findest du doch im FAQ-Beitrag sogar schon entsprechenden Source-Code

Du brauchst nur TerminateAppByWindowClosing mit deiner Prozess-ID aufzurufen
-
flenders schrieb:
Ich habe doch bereits geschrieben, wie du vorgehen musst. Bei CreateProcess bekommst du über lpProcessInformation unter anderem die Prozess-ID. Wenn du jetzt mit EnumWindows die Fenster durchgehst musst du für jedes die ID gegen diese Prozess-ID checken.
Außerdem findest du doch im FAQ-Beitrag sogar schon entsprechenden Source-Code

Du brauchst nur TerminateAppByWindowClosing mit deiner Prozess-ID aufzurufen
Ne, das funktioniert eben nicht.
Vielleicht habe ich mich ein wenig unglücklich ausgedrückt.
Egal, ich kriege das selber irgendwie auf die Reihe
-
rewe schrieb:
flenders schrieb:
Ich habe doch bereits geschrieben, wie du vorgehen musst. Bei CreateProcess bekommst du über lpProcessInformation unter anderem die Prozess-ID. Wenn du jetzt mit EnumWindows die Fenster durchgehst musst du für jedes die ID gegen diese Prozess-ID checken.
Außerdem findest du doch im FAQ-Beitrag sogar schon entsprechenden Source-Code

Du brauchst nur TerminateAppByWindowClosing mit deiner Prozess-ID aufzurufen
Ne, das funktioniert eben nicht.
Vielleicht habe ich mich ein wenig unglücklich ausgedrückt.
Egal, ich kriege das selber irgendwie auf die Reihe
Ich probiere nochmals zu erklären:
Ich stelle die Frage ganz simpel:
Wie kann ich das Explorer-Window finden welches durch CreateProcess kreiert wurde????
Aber Achtung: Meistens existieren bereits mehrere Explorer-Windows.
Es hilft mir also nicht wenn ich alle Windows vom Explorer-Prozess bekomme (das ist einfach und hat bei mir auch funktioniert), ich brauche nur das Window-Handle von dem Window welches ICH kreiert habe.
Any ideas?PS: Betriebssystem ist W2K
-
Ich glaube die Lösung gefunden zu haben
*hoff*
Ich verwende einfach "ShellExecuteEx" anstatt "CreateProcess".
Damit sollte ich direkt ein HWND bekommen.
Ich werde das ausprobieren.Danke an alle die geantwortet haben!