![]() |
ALLE Instanzen eines Programms (auch eingebettete Objekte)
Hallo,
ich möchte sichergehen, dass alle laufenden Instanzen z.B. von MS Excel gefunden und nacheinander angezeigt werden. Das Suchen und Zeigen von "alleinstehenden" Applikationen geht ja noch:
Delphi-Quellcode:
Aber wenn der IE-Explorer ein eingebettetes EXCEL-Fenster besitzt scheitere ich,
ahandle := FindWindow(pchar('XLMAIN'), NIL);
IF aHandle <> 0 THEN ShowWindow(aHandle, SW_SHOWNORMAL); da obige Funktion nur ein EXCEL-Fenster zeigt und nicht den IE-Explorer in den Vordergrund bringt.
Delphi-Quellcode:
funktionieren auch nicht.
ahandle := GetAncestor(aHandle,GA_ROOTOWNER);
bzw. ahandle :=GetParent(aHandle); Wie kann ich nun den IE-Explorer in den Vordergrund bringen, wenn ein EXCEL-Objekt darin gefunden wurde? (Am liebsten mit WIN-API Funktionen, nicht mit DDE oder COM,...) |
Du musst einfach herausfinden, ob der Prozess EXCEL.EXE läuft. Wie das geht, findest du in der Suche.
|
@Chewie,
Zitat:
Zitat:
Wie ich Excel finde, beschreibe ich ebenfalls oben. |
OK, wahrscheinlich wird ein Embedded Process im IE nicht durch EXCEL.EXE erzeugt, sondern es wird wohl ein Modul (wahrscheinlich eine DLL geladen). Wenn du rausfindest, wie diese heißt, kannst über einen SnapShot und mit den Funktionen Module32First und Module32Next das Modul finden, falls es läuft.
Dort sollte auch die Prozess-ID oder vielleicht das Fenster-Handle des Prozesses sein, das das Modul geladen hat. |
@Chewie,
ich muß gestehen ich verstehe nicht alles was Du mir sagen möchtest, ich habe im PSDK nachgeschaut, es wird nicht besser. Zuguterletzt habe ich deine Function ![]() Mein Problem ist aber, dass ich nicht weiß welche Programme sich im IE eingebettet haben (Word, Excel, AcrobatReader), man kann z.B. in den Einstellungen vom AcrobatReader festlegen, ob dieser sich in den Browser integrieren soll oder nicht. Daher möchte ich nur wissen, falls das Programm im IE eingebettet ist, dann den IE zeigen, sonst das Programmfenster zeigen. |
Zitat:
Also: Jede PE-Datei, sei es DLL, EXE oder was auch immer stellt ein Modul dar. Wenn nun ein Excel-Dokument im Internet Explorer geladen wird, wird (vermute ich mal) höchstwahrscheinlich eine DLL als Plugin geladen. Diese DLL kann man nun folgendermaßen finden (vorausgesetz, man kennt ihren Namen): 1. Mit CreateToolHelp32SnapShot einen Snapshot der Prozesse machen. 2. Jetzt kann man alle IE-Prozesse erkennen 3. Erneut mit CreateToolHelp32SnapShot einen Snapshot der Module jedes oben gefundenen Prozesses machen (Stichwort: Module32First bzw. Module32Next) 4. Jetzt kann man prüfen, welche Prozesse die entsprechende DLL geladen haben. Achtung: Diese Methode ist recht rechenaufwändig und außerdem beruht sie auf der Annahme, bei der Darstelung von Excel-Doks im IE würde ein Modul geladen. Falls das nicht der Fall ist, kann man obiges ganz in die Mülltonne treten. Außerdem ist man hier noch nicht fertig. Man muss noch aus der Prozess-ID das Handle des Hauptfensters finden, was über EnumThreads des Prozesses und EnumThreadWindows aller Threads des Prozesses geht. Alles in allem ein sehr komplizierter Weg, wenn er denn überhaupt funktioniert. Wahrscheinlich gibt es einen einfacheren weg, vielleicht mit Benutzung der Excel-OLE-Objekte. Edit: Zitat:
Allerdings fällt mir gerade auf, dass das nur sinnvoll ist, wenn nur eine Instanz des Programms läuft, da nur die Thread-IDs des erstgefundenen Prozesses aufgelistet werden. |
Leute, ich gebs auf!
Hallo,
nachdem ich stundenlang eine Lösung zu meinem Problem Zitat:
Es passiert sehr häufig, dass, wenn man über den IE *.pdf oder *.xls Dokumente öffnet und sich die jeweilige Applikation in den Browser einbettet, Programm(fragmente) im Speicher zurückbleiben, wenn man den Browser längst wieder geschlossen hat!
Delphi-Quellcode:
identifiziert diese auch als Instanz von Excel, daher ist es für mich unmöglich zu erkennen, ob der Prozess nun "nur im Speicher" steht, oder ob er in ein anderes Programm eingebettet ist!
FindWindow(pchar('XLMAIN'), NIL)
Obwohl ich nun mit
Delphi-Quellcode:
diese Speicherleichen zeigen kann, damit sie der User schliessen kann. :roll:
ShowWindow(aHandle, SW_SHOWNORMAL);
Tja, danke für die Hilfe und aus! :pale: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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