Autor Beitrag
fuggaz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 106



BeitragVerfasst: Mo 03.10.11 03:44 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 03.10.11 04:44 
user profile iconfuggaz hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconfuggaz hat folgendes geschrieben Zum zitierten Posting springen:
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 ab, oder? Und dann bekommst du ja nur Fenster dieses Prozesses.
fuggaz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 106



BeitragVerfasst: Mo 03.10.11 13: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 03.10.11 14: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 106



BeitragVerfasst: Mo 03.10.11 20: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.