如何关闭正在运行的程序(自动确认)(100分)

  • 主题发起人 主题发起人 fuku
  • 开始时间 开始时间
F

fuku

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道用FindWindow来查找正在运行程序的窗口句柄,然后SendMessage(HWnd,WM_CLOSE,0,0)或
CloseWindow来关闭它。但该程序在退出前会弹出确认窗口,提示用户确认、取消或是退回,那如何
实现自动确认?请诸位能者指教!
 
用postmessage试试,用sendmessage会有确认吗?[?]
 
TerminateProcess
 
再抓提示窗口的“确认”按钮的句柄,一并关了
var
h,hw: Thandle;
begin
h := findwindow(nil,'提示');
if h <> 0 then
begin
hw := GetDlgItem(h, IDyes);
if hw <> 0 then
PostMessage(h,wm_close,0,0);
end;
end;
 
To nibul:会不会出现确认窗口是所运行的程序决定的。
To menxin:TerminateProcess与DestroyWinow一样,无法结束该程序。
To 一少:hw无法获取,返回0。

 
无法结束?应该是你没有找到正确的processID,或者根本无权访问
 
To menxin:TerminateProcess(THandle,UInt)中第一个参数我取的是程序的窗口句柄,的第二个参数该填什么?另外用TerminateProcess会不会丢失该程序正在处理的数据?谢谢!
 
TerminateProcess是最直接也是最野蛮的方法,它会使进程
无条件退出,不管它正在干什么,数据是别指望了.
 
这问题至少有800个人问过了,不就是关闭现成吗
var
H:THandle;
P:DWORD;
begin
H:=FindWindow(nil,'无标题 - 记事本');
if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
end;
 
感谢jieson,他的方法确实可行,分数应该给他。但为了尽量不造成数据丢失,我个人认为
如果能获取确认对话框的句柄,然后模拟按下确认按钮,以便程序正常结束是否更好。怎样
才能做到这种效果?答复者另送分数,谢谢!
 
var
h,h1: hwnd;

h:= findwindow(nil,'提示'); //取对话框句柄
h1 := findwindowex(h,0,nil,'是(&Y)'); //取“是(Y)”按钮的句柄

接下来发个单击消息给h1就行了,我刚刚试了一下
{postmessage(h1,WM_LBUTTONDOWN,0,0);
postmessage(h1,WM_LBUTTONup,0,0); }
居然单击不成功,反正句柄已经抓到了,不信你
enablewindow(h1,false); 看看
 
成了,给分:)
以关闭notepad出现的对话框为例,实现点对话框中的“否(N)”按钮
var
h,h1: hwnd;
begin
h:= findwindow(nil,'记事本');
h1 := findwindowex(h,0,nil,'否(&N)');
SetForegroundWindow(h);
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0); //按TAB键
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //按回车
end;
 
To一少:谢谢你热心的帮助!你的方法确实可以关闭确认对话框,但前提必须是该对话框
已打开,实际情况是需要向应用程序发送WM_CLOSE该确认对话框才会产生。我试着在前面
了两句——

hd:= findwindow(nil,'无标题 - 记事本'); //获取记事本程序窗口句柄
sendmessage(hd,wm_close,0,0); //A处
h:= findwindow(nil,'记事本');
h1 := findwindowex(h,0,nil,'否(&N)');
SetForegroundWindow(h);
keybd_event(VK_TAB,0,0,0);
keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0); //按TAB键
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //按回车

结果是执行到A处程序暂停,等待用户对所弹出的确认窗口进行操作,就是说程序得不到
sendmessage的结果代码是无法继续执行的。哎,我要昏了。
 
FHandel:=OpenProcess(PROCESS_ALL_ACCESS,true,th32ProcessID);
if FHandel <> 0 then begin
try
TerminateProcess(FHandel, 0);
finally
CloseHandle(FHandel)
end;
end;
 
多人接受答案了。
 
唉,processid和window handle本来就是两码事,没有你这么用的啊
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部