Anderen Prozess beenden
-
Hallo !
Ich möchte ein Programm beenden, welches sich rechts unten in die Taskleiste als Icon minimiert hat und somit nur noch in der Processliste auftaucht.
Ich wollte ihm ein WM_QUIT mittels PostMessage() senden, aber dafür benötige ich ein HWND. Das gibt es aber nicht, nur eine PID.HWND hCNC;
hCNC = FindWindow( ,"Ein >Window Name<");
::PostMessage(hCNC,WM_QUIT,0,0);So komme ich leider nicht weiter.
Gibt es einen gangbaren Weg ?
Vielen Dank.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Humaner Weg (meistens): SendMessage(hWnd, WM_SYSCOMMAND, (WPARAM) SC_CLOSE, 0);
Radikaler Weg: TerminateProcess
-
Vielleicht hilft dir das weiter: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39369.html
-
ich würd ja eher an
PostThreadMessage(pID, WM_QUIT,0,0)
(oder so ähnlich) denken
-
Vielen Dank, konnte mein Problem nun wie folgt lösen :
bool __fastcall PrgStopRunning(AnsiString AExeName) { bool hasTerminated = false; if (AExeName == "") return hasTerminated; DWORD APID; if (PrgGetIsRunning(AExeName,NULL,&APID)) { // Handle auf den Process holen und benötigte Rechte setzen HWND hPro = OpenProcess(PROCESS_TERMINATE,false,APID); // Process mit Fehlercode "0" normal beenden hasTerminated = TerminateProcess(hPro,0); } return hasTerminated; }
-
TerminbateProcess arbeitet asynchron. Der Rückgabewert gibt nur an, ob die Funktion auch ausgeführt werden konnte, nicht aber, ob der Prozess erfolgreich beendet werden konnte!
TerminateProcess initiates termination and returns immediately. This stops execution of all threads within the process and requests cancellation of all pending I/O. The terminated process cannot exit until all pending I/O has been completed or canceled.
-
Richtiger Einwand von Luckie, TerminateProcess arbeitet asynchron
Falls dir das ein Dorn im Auge ist, schau dir die Funktion WaitForSingleObject an.
Kleinigkeit: OpenProcess gibt nicht ein HWND (Handle auf ein Fenster) zurück, sondern ein HANDLE (auf einen Prozess).
-
nur Interessehalber:
was spricht dagegen den Prozess erst freundlich zum Beenden aufzufordern ?