이제 시작하는 델피 신입인데요.
버튼 동작으로 해당 프로세스를 죽이는 프로그램을 작성중입니다.
찾아본 결과로 해당 리스트 박스에 프로세스 목록을 뿌리는데요.
이 리스트 박스에 있는 해당 프로세스를 찾아서 죽이는 방법을 구현해보려 합니다..
일단은 리스트 박스까지 뿌리는 소스는
<!--CodeS-->
procedure Process32List(Slist: TStrings);
var
Process32: TProcessEntry32;
SHandle: THandle; // the handle of the Windows object
Next: BOOL;
begin
Process32.dwSize := SizeOf(TProcessEntry32);
SHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(SHandle, Process32) then
begin
// 실행화일명과 process object 저장
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
repeat
Next := Process32Next(SHandle, Process32);
if Next then
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
until not Next;
end;
CloseHandle(SHandle); // closes an open object handle
end;
procedure TForm1.Button1Click(Sender: TObject);
var
h:HWND;
i:Integer;
s:String;
begin
ListBox1.Items.Clear;
Process32List(ListBox1.Items);
end;
<!--CodeE-->
여기 까지 리스트박스에 내용을 뿌리구요
다음 동작을 해당 프로세스 리스트값을 찾아서 그 프로세스를 죽이는 방법인데요...
<!--CodeS-->
if ListBox1.ItemIndex < 0 then System.Exit;
ProcId := DWORD(ListBox1.Items.Objects[ListBox1.ItemIndex]);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcId);
if hProcess = NULL then ShowMessage('OpenProcess error !');
TermSucc := TerminateProcess(hProcess, 0);
if TermSucc = FALSE then
ShowMessage('TerminateProcess error !')
else
ShowMessage(Format('Process# %x terminated successfully !', [ProcId]));
ListBox1.Items.Clear;
Process32List(ListBox1.Items);
end;
<!--CodeE-->
이 소스는 리스트박스 내용 프로세스중 해당 프로세스 선택값만 죽이기 인데염
버튼 두개로 진행하는거라서....
이렇게 보다 버튼 하나로 걍 뿌려서 선택없이 해당 실행 파일 리스트 값만 찾아서
죽일수는 없을까여? ㅜ_ㅜ 헤메고 있는 저에게 오아시스좀 내려주세여 ㅠ_ㅠ
ProcId := DWORD(ListBox1.Items.Objects[ListBox1.ItemIndex]);
이부분에서 작업을 해야할거 같은데... 어찌 해야 할지를 모르겠어여...
procedure Process32List(Slist: TStrings);
var
Process32: TProcessEntry32;
SHandle: THandle; // the handle of the Windows object
Next: BOOL;
begin
Process32.dwSize := SizeOf(TProcessEntry32);
SHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(SHandle, Process32) then
begin
// 실행화일명과 process object 저장
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
repeat
Next := Process32Next(SHandle, Process32);
if Next then
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
until not Next;
end;
CloseHandle(SHandle); // closes an open object handle
end;
function GetProcIDFromList(Slist: TStrings; ProcName : String) : DWord
begin
Result := -1;
Result := DWORD(Slist.Objects[Slist.IndexOf(ProcName)]);
end;
<!--CodeE-->
에구.. 게시판에서 곧바로 코딩이라 디버깅 해야 하실수도 있습니다.
위처럼 하시고
Process32List 를 한번 호출하신다음에, GetProcIDfromList로 Dword값을 가져와서, 킬~ 하시면 될거 같네요.
프로세스 이름으로 ProcID만 받아오면 될것 같습니다.^^