![]() |
anderes Programm beenden
Hallo,
ich möchte eine .exe Datei bei Programmstart meines Programms starten und bei Beenden meines Programms auch wieder mit beenden. Ein anderes Programm aus meinem Programm heraus starten krieg ich ja noch hin, aber wie beende ich es denn wieder? Gruß Gambit |
Re: anderes Programm beenden
Du kannst z.B. an das Fensterhandle eine WM_CLOSE Nachricht schicken. Besser wäre eine SC_CLOSE Nachricht. Oder eine PostQuitMessage an den Thread. Und zu allerletzt kannst du das Programm brutal mit TerminateProcess beenden.
|
Re: anderes Programm beenden
Das Teil läuft aber nur im Tray ohne ein Fenster. Ein Fensterhandle habe ich da wohl nicht, oder?
|
Re: anderes Programm beenden
Zitat:
|
Re: anderes Programm beenden
Also folgendermaßen funzt es jetzt:
Delphi-Quellcode:
Aber wie müsste denn meine Anweisung in Button2Click ausehen, wenn ich den Prozess "kontrolliert" beenden möchte?
procedure TForm1.Button1Click(Sender: TObject);
begin FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := Sizeof(TStartupInfo); if CreateProcess(nil, // Anwendungsname PChar(edit1.text), // Parameter nil, // Security nil, // Security False, NORMAL_PRIORITY_CLASS, // Priorität nil, // Environment PChar(edit2.text), // Verzeichnis StartupInfo, ProcessInfo) then begin end else Showmessage('Fehler!'); end; procedure TForm1.Button2Click(Sender: TObject); begin TerminateProcess(ProcessInfo.hProcess,0); Showmessage('Prozess beendet!'); end; Gruß Gambit |
Re: anderes Programm beenden
@Sprint:
Habe mal versucht dein Beispiel, welches du hier im Forum mal gepostet hattest auf meines umzusetzten, funzt damit aber nicht, ich muss wohl auf terminateProcess zurückgreifen und die Keule nehmen... Hier noch Mal dein Code:
Delphi-Quellcode:
Gruß
procedure TForm1.Button1Click(Sender: TObject);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end; var SI: TStartupInfo; PI: TProcessInformation; List: TList; ProcessId: DWORD; AppHWnd: HWND; I: Integer; begin AppHWnd := 0; FillChar(SI, SizeOf(TStartupInfo), 0); SI.cb := SizeOf(TStartupInfo); SI.dwFlags := STARTF_USESHOWWINDOW; SI.wShowWindow := SW_SHOW; if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then begin WaitForInputIdle(PI.hProcess, INFINITE); CloseHandle(PI.hProcess); CloseHandle(PI.hThread); List := TList.Create; try if EnumWindows(@EnumWindowsProc, Longint(List)) then begin for I := 0 to List.Count - 1 do if GetWindowThreadProcessId(HWND(List.Items[I]), @ProcessId) <> 0 then if ProcessId = PI.dwProcessId then begin AppHWnd := HWND(List.Items[I]); Break; end; if IsWindow(AppHWnd) then begin ShowMessage('Fensterhandle ist $' + IntToHex(AppHWnd, 8)); SendMessage(AppHWnd, WM_SYSCOMMAND, SC_CLOSE, 0); end; end; finally List.Free; end; end; end; Gambit |
Re: anderes Programm beenden
Zitat:
Delphi-Quellcode:
var
AppPID: DWORD;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var SI: TStartupInfo; PI: TProcessInformation; begin FillChar(SI, SizeOf(TStartupInfo), 0); SI.cb := SizeOf(TStartupInfo); if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then begin AppPID := PI.dwProcessId; CloseHandle(PI.hProcess); CloseHandle(PI.hThread); end; end;
Delphi-Quellcode:
Ich musste da mal ein Wait einbauen. Normalerweise würde ich Sleep nehmen. Dann läuft der Code aber auch in einem eigenen Thread. So ähnlich sieht die Funktion in meinem nachprogrammierten Task-Manager aus, um Anwendungen zu schließen.
procedure TForm1.Button2Click(Sender: TObject);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin TList(lParam).Add(Pointer(hWnd)); Result := True; end; procedure Wait(MilliSeconds: DWORD); var Stop: DWORD; begin Stop := GetTickCount + MilliSeconds; while Stop > GetTickCount do begin Sleep(100); Application.ProcessMessages; end; end; var List: TList; I: Integer; ProcessId: DWORD; ThreadId: DWORD; ProcessHandle: THandle; ExitCode: DWORD; begin if AppPID <> 0 then begin List := TList.Create; try EnumWindows(@EnumWindowsProc, LPARAM(List)); for I := 0 to List.Count - 1 do begin ThreadId := GetWindowThreadProcessId(HWND(List.Items[I]), ProcessId); if ProcessId = AppPID then begin SendMessageTimeout(HWND(List.Items[I]), WM_SYSCOMMAND, SC_CLOSE, 0, SMTO_ABORTIFHUNG, 500, DWORD(nil^)); Wait(3000); if IsWindow(HWND(List.Items[I])) then begin PostThreadMessage(ThreadId, WM_QUIT, 0, 0); Wait(3000); ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId); if ProcessHandle <> 0 then begin GetExitCodeProcess(ProcessHandle, ExitCode); TerminateProcess(ProcessHandle, ExitCode); CloseHandle(ProcessHandle); end; end; Break; end; end; finally List.Free; end; end; end; |
Re: anderes Programm beenden
OK, Danke! Dann versuch ichs mal damit...
Gruß Gambit |
Re: anderes Programm beenden
Ja, das funzt dann so auch. Einziger Schönheitsfehler - und das war auch bei meiner Haudraufundschluss-Version so - ist, dass das Icon des zu beendenden Programms nicht aus dem Tray verschwindet...erst wenn mann mit der Maus drüber fährt...
Gruß Gambit |
Re: anderes Programm beenden
Das wirst du nicht ändern könne, weil das Fenster kein WM_CLOSE oder WM_DESTROY mehr bekommt, in denen er wohl das Icon aus der TNA entfernt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz