程序退出是关闭系统进程,100分送上

wsxcdx 2010-04-16 03:07:20
写了个小程序,用到了Acrobat的PDF控件
现在运行的时候会加载一个Acrobat.exe进程
但是退出的时候Acrobat.exe进程不会自己退出
再打开程序的时候就无法打开了
现在是想在退出时关闭Acrobat.exe这个进程
但是对windows方面不熟悉,网上的代码看了些也没看懂
请问一下这个具体该怎么解决?
...全文
145 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxcdx 2010-04-16
  • 打赏
  • 举报
回复
谢谢大家,先结贴了
hongss 2010-04-16
  • 打赏
  • 举报
回复
先用FindWindowex找到hwnd,然后用TerminateProcess来关闭,

或者用消息机制SendMessage,WM_CLOSE也可以
wsxcdx 2010-04-16
  • 打赏
  • 举报
回复
一直都是做做数据库方面的,这个看起来太难了
呵呵,好在网上的代码和高手多,还可以解决问题
看来是要多学习一点东西了
风之谷 2010-04-16
  • 打赏
  • 举报
回复
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapShotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
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(AFileName))
or (UpperCase(FProcessEntry32.szExeFile ) =
UpperCase(AFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
风之谷 2010-04-16
  • 打赏
  • 举报
回复
找到进程,然后强制结束进程就可以了
金卯刀 2010-04-16
  • 打赏
  • 举报
回复
http://hi.baidu.com/yangvb/blog/item/a2fcf7f2a995c515b17ec52e.html
找了一段與你貼出來的代碼相似的,里面有注釋,看看吧
wsxcdx 2010-04-16
  • 打赏
  • 举报
回复
找了段帖上去貌似能解决问题,我贴上来高手帮忙解释一下吧

function TMainForm.FindProcess(AFileName: string): boolean;//查找进程
var
hSnapshot: THandle;
lppe: TProcessEntry32;
Found: Boolean;
KillHandle: THandle;
begin
Result :=False;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize := SizeOf(TProcessEntry32);
Found := Process32First(hSnapshot, lppe);
while Found do
begin
if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then
begin
Result :=True;
end;
Found := Process32Next(hSnapshot, lppe);
end;
end;

procedure TMainForm.EndProcess(AFileName: string);//结束进程
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapShotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
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(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Messagebox(handle,'确定退出吗?','提示',MB_YESNO+MB_ICONQUESTION)=IDYES then
begin
if FindProcess('Acrobat.exe') then //调用
begin
EndProcess('Acrobat.exe');
end;
CanClose:=true;
end
else
CanCLose:=false;

end;

金卯刀 2010-04-16
  • 打赏
  • 举报
回复
既然都可以找到代碼,那問題就很好解決啊。

你是想找人解釋代碼嗎? 那就先貼出源碼...
wsxcdx 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sz_haitao 的回复:]

使用api:找到acrobat.exe的进程id,再kill掉
[/Quote]
我也知道这个方法可以解决,就是不知道该怎么写代码啊
haitao 2010-04-16
  • 打赏
  • 举报
回复
使用api:找到acrobat.exe的进程id,再kill掉

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧