Zum Inhalt springen

ShellExecute und hWnd


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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