Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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...

Geschrieben

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?

Geschrieben

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.

Geschrieben

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

Geschrieben
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.
Geschrieben

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?

Geschrieben
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?
Geschrieben

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.

Geschrieben

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?

Geschrieben

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...

Geschrieben

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.

Geschrieben

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]

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...