Entwickler-Ecke
Windows API - CreateProcess(Explorer.exe,...) -> Fensterhandle
fuggaz - Mo 03.10.11 02:44
Titel: CreateProcess(Explorer.exe,...) -> Fensterhandle
Hallo,
ich habe Probleme mit Programmen, die ihre PID einfach ändern, wie z.B. explorer.exe.
Dann kann ich über CreateProcess und EnumWindows kein Fensterhandle bekommen, sondern laufe ins Leere.
Allerdings muss ich sagen, dass ich speziell bei explorer.exe auch mit gegebener PID nicht weiterkommen würde, da ich zurzeit einfach das Fenster ohne parent suche.
Ich möchte keine speziell zugeschnittene Version für jedes Programm mit diesem Problem schreiben - Mir fällt aber leider
auch nichts Vernünftiges dazu ein, wie ich an das Handle kommen könnte.
Hat jemand da eine Idee?
jaenicke - Mo 03.10.11 03:44
fuggaz hat folgendes geschrieben : |
| ich habe Probleme mit Programmen, die ihre PID einfach ändern, wie z.B. explorer.exe. |
Wie meinst du das? Ein Prozess kann seine Prozess-ID nicht ändern. Speziell bei der explorer.exe ist es genau wie bei anderen Programmen aber üblich, dass mehrere Instanzen des Prozesses (mit logischerweise verschiedenen Prozess-IDs) laufen.
Wenn du selbst ein Programm mit CreateProcess startest, hast du aber ja die konkrete Prozess-ID.
fuggaz hat folgendes geschrieben : |
| Allerdings muss ich sagen, dass ich speziell bei explorer.exe auch mit gegebener PID nicht weiterkommen würde, da ich zurzeit einfach das Fenster ohne parent suche. |
Wie meinst du das? Wenn du die Fenster einer bestimmten Prozess-ID suchst, gleichst du diese doch wohl in dem EnumWindows-Callback mit
GetWindowThreadProcessId [
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522.aspx] ab, oder? Und dann bekommst du ja nur Fenster dieses Prozesses.
fuggaz - Mo 03.10.11 12:57
Hi,
1)
Es geht in etwa so ab:
Ich führe, z.B. chrome.exe aus. Diese startet und gibt mir eine PID zurück. Chrome bemerkt dann, dass der Browser schon läuft, sagt ihm bescheid, dass ein neues Fenster benötigt wird und beendet sich selbst. Der Parent aller Browserfenster wird dann ein neues Fenster öffnen, natürlich mit anderer PID. Das meine ich mit PID-Wechsel.
2)
Also bei mir ist explorer.exe nur einmal vorhanden, auch ersichtlich mit ProcessExplorer (Win7x64). D.h. nicht nur "ändert" sich die PID, sondern es gibt sogar nur eine einzige. Ich habe noch nicht ausprobiert, wer der letztendliche Papa ist, aber vllt. ist dies ja der Desktop ;-).
Edit:
Und ja ich mache es so, wie du es beschrieben hast.
Bloß muss ich dann noch den Parent des Fensters finden, da ich sonst z.B. ein Handle von Default-IME bekomme, dass ich natürlich nicht möchte.
jaenicke - Mo 03.10.11 13:18
Eine allgemeine Lösung dazu wird es nicht geben, jedenfalls nicht mit vertretbarem Aufwand. :gruebel:
Theoretisch kannst du natürlich CreateProcess usw. hooken und so mitbekommen, wenn eine neue Instanz gestartet wird. Bei einer Benachrichtigung an eine bestehende Instanz wird es dann aber schon kniffliger.
Das liest sich so als wäre es eher sinnvoll, dass der Benutzer selbst das betreffende Fenster auswählt. Das geht viel einfacher und zuverlässiger.
Oder was hast du eigentlich vor? Vielleicht gibt es auch eine andere Lösung. :gruebel:
fuggaz - Mo 03.10.11 19:10
Ich habe ein Programm, dass sich auf Knopfdruck, wie ein zweiter Desktop, über alle Programme legt.
Dort kann man dann Programme starten. Es nervt nur, wenn man meinen "Overlay-Desktop" dann schließt und der Fokus sonst wo ist, nur nicht im neugestarteten Fenster.
Das wollte ich gerne automatisch regeln.
Ich hatte schon mit GetForegroundWindow&co experimentiert, aber das ist letztendlich zu willkürlich, da gerne etwas dazwischen funkt.
Hooken traue ich mir nicht bei vertretbarem Aufwand zu, weshalb es mangels allgemeiner Lösung dann vllt. auf eine semi-zuverlässige Mischlösung rausläuft.
Es ist eigentlich schade, dass Windows dort keine Funktion mitbringt, dass z.B. das gestartete Programm das passende Windowhandle zurückgibt.
Ich denke das würde einiges an EnumWindows-Aufrufen sparen.
Mir fällt da gerade etwas ein, dass ich vllt. machen könnte:
Suchen ob ein Prozess der .exe schon läuft (klappt dann nicht für java-programme...) und davon alle Handles speichern und nach CreateProcess das gleiche Prozedere nochmals. Das schränkt im allg. wohl die möglichen Handles ein - naja Mischlösung.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!