FinalFantasy Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Hi, ich starte ein Programm mittels ShellExecute, was mir ja das Instanzhandle zurückgibt. Jetzt bräuchte ich aber das Windowhandle zu diesem Prozess, und zwar zu genau diesem. FindWindow scheidet daher aus, da es mehrere Fenster geben kann (das Programm wurde bsp. öfter gestartet). Wie komme ich jetzt an das Windowhandle? Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Hmm du könntest ein bisschen tricksen und bevor du das Programm startest ein eigenes unsichtbares Fenster erstellen. Dieses gibst du dann bei ShellExecute als Parent des Programms an und bei FindWindow oder EnumWindows prüfst du dann ob das gefundene Fenster auch dein Fenster als Parent hat... Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Hmm, ich habs jetzt so gelöst, dass ich alle Fenster durchgehe, und mittels GetWindowThreadProcessID(tmpHwnd, &hInstanceTemp); die ID des Prozesses ermittle, der das Fenster erzeugt hat (hInstanceTemp) und diesen dann mit meinem eigenen vergleiche... Allerdings krieg ich von ShellExecute immer 42 als Ergebnis... das scheint mir doch etwas unrealistisch zu sein... Haha, vera.... *hmpf* In der MSDN steht (zumindest) bei ShellExecuteEx: hInstApp If the function succeeds, it sets this member to a value greater than 32. If the function fails, it is set to an SE_ERR_XXX error value that indicates the cause of the failure. Although hInstApp is declared as an HINSTANCE for compatibility with 16-bit Windows applications, it is not a true HINSTANCE. It can be cast only to an integer and compared to either 32 or the following SE_ERR_XXX error codes. Kann man das Programm anders starten, oder hat jemand eine Idee wie ich auf anderen Wegen ich an das Windowhandle kommen kann? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 ShellExecute gibt kein "echtes" HINSTANCE zurück. Du kannst mit ShellExecuteEx ein Handle des Prozesses bekommen - in der Struktur, nicht im Rückgabewert. Über dieses Handle kannst du dann mit GetProcessId an die Prozess-ID kommen. Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Siehe mein anderes Posting. Laut MSDN gibt auch ShellExecuteEx kein echtes HINSTANCE in der Struktur zurück. Aber ich hab eben gesehen, dass CreateProcess() eine Struktur mit Prozeßinformationen zurückgibt... werd ich nach der Mittagspause mal probieren Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Ja hatte ich auch dran gedacht, aber über die Prozess ID kommt auch an kein Window Handle..oder? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Siehe mein anderes Posting. Laut MSDN gibt auch ShellExecuteEx kein echtes HINSTANCE in der Struktur zurück.hProcess, nicht hInstance. Ja hatte ich auch dran gedacht, aber über die Prozess ID kommt auch an kein Window Handle..oder?Nein, aber über das Fensterhandle an die Prozess-ID. Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Ah also von hinten durch die Brust in die Hand Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 mhh, in hProcess krieg ich jetzt immer 1580 oder 1584, was nicht der PID meines Prozesses entspricht. Unabhängig von SEE_MASK_NOCLOSEPROCESS. Warum ist hProcess eigentlich vom Typ Handle und nicht vom Typ HINSTANCE? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 mhh, in hProcess krieg ich jetzt immer 1580 oder 1584, was nicht der PID meines Prozesses entspricht. Über dieses Handle kannst du dann mit GetProcessId an die Prozess-ID kommen. Warum ist hProcess eigentlich vom Typ Handle und nicht vom Typ HINSTANCE?Mal abgesehen davon, dass HINSTANCE nur ein typedef von HANDLE ist: Warum sollte es ein HINSTANCE sein? Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Ok, GetProcessId() gibt es anscheinend erst seit WinXP SP1, was schonmal nicht gut ist... naja egal. Jedenfalls krieg ich immer 0 zurück. Ich finde es auch schon komisch, dass hProcess bei mir immer 1580 oder 1584 ist. Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Warum auch nicht? Damit sich der Wert theoretisch ändert müsstest du ja zwischen den Versuchen andere Prozesse starten und laufen lassen. Außerdem behält XP doch die letzten Anwendungen nach dem Ausführen irgendwie im Speicher um sie beim nächsten mal schneller starten zu können, evtl wird ja die Prozess ID mit gespeichert... Hast du mal geprüft was für ein Fehler genau auftritt? Zitieren
Klotzkopp Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Jedenfalls krieg ich immer 0 zurück.Was sagt GetLastError? Ich finde es auch schon komisch, dass hProcess bei mir immer 1580 oder 1584 ist.Das ist nicht komisch. Die Prozesshandles werden wiederverwendet. Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 GetLastError() = 6 nach GetProcessID() und das entspricht "The handle is invalid." Habs jetzt auch mit CreateProcess() probiert, da ist hProcess immer 1800 und gibt auch den Errorcode 6. Edit: Argh, Hirn wo bist du... CreateProcess liefert ja auch direkt die PID und die stimmt sogar... Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Die von ShellExecuteEx stimmt auch Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Ne, ShellExecuteEx liefert mir ja nur ein Processhandle, über dieses sollte ich dann mit GetProcessId die PID ermitteln können, aber eben diese Funktion liefert mir den Errorcode 6. CreateProcess liefert mir sowohl das Processhandle, als auch direkt die PID. die PID stimmt auch, aber wenn ich GetProcessId mit dem Handle von CreateProcess aufrufe, kriege ich auch den Fehler 6.... Schon komisch, ich verstehs jedenfalls nicht. Zitieren
Guybrush Threepwood Geschrieben 7. Februar 2006 Geschrieben 7. Februar 2006 Naja ohne das du uns zeigst wie du es versucht hast wird dir niemand sagen können wo der Fehler liegt... Zitieren
FinalFantasy Geschrieben 7. Februar 2006 Autor Geschrieben 7. Februar 2006 Ok, es funktioniert ja jetzt mithilfe der PID von CreateProcess, aber GetProcessID, wie Klotzkopp geschrieben hat, funktioniert nicht (Invalid Handle), TerminateProcess mit dem selben Handle funktioniert dagegen. Is leider Delphi, aber ist ja größtenteils eh WinAPI. procedure startPutty(); var startup: STARTUPINFO; PuttyInfo: PROCESS_INFORMATION; pid: dword; begin CreateProcess(nil, 'putty.exe', nil, nil, true, NORMAL_PRIORITY_CLASS, nil, nil, startup, PuttyInfo); pid := GetProcessId(PuttyInfo.hProcess); //da krieg ich 0 zurück GetLastError(); // = 6 TerminateProcess(PuttyInfo.hProcess); //funktioniert komischer weise end; [/PHP] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.