Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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

  • Autor

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?

  • Autor

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

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

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?

  • Autor

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

  • Autor

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.

  • Autor

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]

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.