Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
Delphi 5 Professional
|
Re: anderes Programm beenden
11. Feb 2005, 21:28
Zitat von Gambit:
Aber wie müsste denn meine Anweisung in Button2Click ausehen, wenn ich den Prozess "kontrolliert" beenden möchte?
Für ein sauberes beenden, muss man paar Zeilen mehr schreiben.
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:
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;
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.
Ciao, Sprint.
"I don't know what I am doing, but I am sure I am having fun!"
|
|
Zitat
|