我在程序中使用了acrobat的pdf控件,这样每次运行的时候都会在“任务管理器”的进程列表里面发现一个叫AcroRd32.exe的进程,程序退出的时候这个进程应该也终止,但是我发现有时候这个进程退出的特别慢,或者不能正常退出,如果在正常退出之前我又运行我编的程序就不能正常的打开pdf文件了,所以我想在程序退出前手动杀死这个AcroRd21.exe线程。
问题如下:
1、如何找到这个线程的句柄,因为是嵌在我的程序里面的,所以在应用程序列表里面是没有acrobat.exe项的,只有线程列表里面有AcroRd32.exe项,如果用findwindow(nil,参数),这个参数应该是窗口的名称,我没法知道阿,我能不能就根据这个AcroRd32.exe线程名称或取句柄呢。
2、获取到这个句柄后如何安全的杀死我对线程什么的不是很清楚,请老大们给出源程序。另外,我看到很多人说可以用什么线程快照阿之类的东东,不明白是干什么的,能不能解释一下那个api的具体用法,最好能从理论开始了,呵呵,多谢,
问题如下:
1、如何找到这个线程的句柄,因为是嵌在我的程序里面的,所以在应用程序列表里面是没有acrobat.exe项的,只有线程列表里面有AcroRd32.exe项,如果用findwindow(nil,参数),这个参数应该是窗口的名称,我没法知道阿,我能不能就根据这个AcroRd32.exe线程名称或取句柄呢。
2、获取到这个句柄后如何安全的杀死我对线程什么的不是很清楚,请老大们给出源程序。另外,我看到很多人说可以用什么线程快照阿之类的东东,不明白是干什么的,能不能解释一下那个api的具体用法,最好能从理论开始了,呵呵,多谢,
Tlhelp32; function KillTask(ExeFileName: string): Integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(0),
FProcessEntry32.th32ProcessID),
0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end; procedure TForm1.Button1Click(Sender: TObject);
begin
KillTask('notepad.exe');
end; { For Windows NT/2000/XP } procedure KillProcess(hWindowHandle: HWND);
var
hprocessID: INTEGER;
processHandle: THandle;
DWResult: DWORD;
begin
SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult); if isWindow(hWindowHandle) then
begin
// PostMessage(hWindowHandle, WM_QUIT, 0, 0); { Get the process identifier for the window}
GetWindowThreadProcessID(hWindowHandle, @hprocessID);
if hprocessID <> 0 then
begin
{ Get the process handle }
processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
False, hprocessID);
if processHandle <> 0 then
begin
{ Terminate the process }
TerminateProcess(processHandle, 0);
CloseHandle(ProcessHandle);
end;
end;
end;
end; procedure TForm1.Button2Click(Sender: TObject);
begin
KillProcess(FindWindow('notepad',nil));
end;
一種是根據程序名
KillTask('notepad.exe'); 一種是根據窗口名
KillProcess(FindWindow('notepad',nil)); 用的都是windows 的Api