Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Mit TShellExecuteInfo Programm schließen? (https://www.delphipraxis.net/194366-mit-tshellexecuteinfo-programm-schliessen.html)

iphi 12. Nov 2017 16:48

Mit TShellExecuteInfo Programm schließen?
 
Hallo,

ich starte ein externes Programm mit
Delphi-Quellcode:
ShellExecuteEx(x: TShellExecuteInfo)
und hatte gehofft, mit
Delphi-Quellcode:
x.hProcess
das Handle zum gestarteten Programm zu haben, mit dem ich das mittels
Delphi-Quellcode:
SendMessage(x.hProcess, WM_CLOSE, 0, 0);
wieder beenden kann.
Das Handle stimmt aber nicht.
Kann ich mit der Information in der TShellExecuteInfo-Struktur x trotzdem das gestartete Programm identifizieren und stoppen?

himitsu 12. Nov 2017 17:17

AW: Mit TShellExecuteInfo Programm schließen?
 
MSDN-Library durchsuchenSendMessage und MSDN-Library durchsuchenPostMessage senden ausschließlich an Windows-Handle (HWND),
aber du hast ein Prozess-Handle (HANDLE).

Man kann via MSDN-Library durchsuchenPostThreadMessage eine Message direkt an den Thread-Handle Thread-ID (DWORD) des Hauptfensters der Application schicken.

Wie dem auch sei, du mußt dir also erstmal ein Fenster oder den/alle Threads des anderen Programms suchen, dessen Prozess-ID du ebenfalls bekommen hast.


MSDN-Library durchsuchenTerminateProcess könnte man eventuell mit dem Handle nutzen, aber das wäre so, als wenn man sein eigenes Programm immer mit Delphi-Referenz durchsuchenHalt abschießt, also bähhhhhhhh.

Zacherl 12. Nov 2017 17:47

AW: Mit TShellExecuteInfo Programm schließen?
 
Eine interessante Alternative die ich mal gesehen hatte, war es mit MSDN-Library durchsuchenCreateRemoteThread einen Thread im Zielprozess zu erstellen, welcher lediglich MSDN-Library durchsuchenExitProcess aufruft. Damit würdest du den entsprechenden Prozess sauber beenden.

Glados 12. Nov 2017 18:29

AW: Mit TShellExecuteInfo Programm schließen?
 
Würden dabei gute Antivirenprogramme, also nicht Avira, nicht anschlagen?

Zacherl 12. Nov 2017 18:38

AW: Mit TShellExecuteInfo Programm schließen?
 
Zitat:

Zitat von Glados (Beitrag 1386079)
Würden dabei gute Antivirenprogramme, also nicht Avira, nicht anschlagen?

Gute Antivirenprogramme gibt es nicht :stupid: Wenn die Verhaltenserkennung halbwegs ordentlich ist, sollte das aber nicht als gefährliches Verhalten erkannt werden. Ist es ja auch nicht.

iphi 12. Nov 2017 18:43

AW: Mit TShellExecuteInfo Programm schließen?
 
Zitat:

...PostMessage senden ausschließlich an Windows-Handle (HWND),
aber du hast ein Prozess-Handle (HANDLE).
Gibt es keine Funktion, die dem Prozess-Handle das Windows-Handle zuordnet?

DeddyH 12. Nov 2017 19:29

AW: Mit TShellExecuteInfo Programm schließen?
 
Andersherum: du könntest mit EnumWindows über alle Toplevel-Fenster iterieren und dann mit GetWindowThreadProcessID prüfen, ob das aktuelle Fenster zum gemerkten Prozess gehört.

himitsu 12. Nov 2017 22:41

AW: Mit TShellExecuteInfo Programm schließen?
 
Zitat:

Zitat von iphi (Beitrag 1386082)
Gibt es keine Funktion, die dem Prozess-Handle das Windows-Handle zuordnet?

Nein.

Welches Handle? :zwinker:
Eine Anwendung kann mehrere Fenster haben und jedes Control auf den Fenstern ist auch ein "Window-Control" mit einem HWND.

MSDN-Library durchsuchenFindWindow/MSDN-Library durchsuchenEnumWindows und MSDN-Library durchsuchenGetWindowThreadProcessId
https://msdn.microsoft.com/en-us/lib.../ms686837.aspx
oder Dergleichen


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz