if MessageDlg('确认推出吗?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
procedure TForm1.Button1Click(Sender: TObject); var hwd : THandle; begin //Showmessage和MessageDlg的对话框类名是TMessageForm //如果是MessageBox的对话框,类名是#32770 hwd := FindWindow('TMessageForm','Confirm');
if hwd>0 then begin hwd := FindWindowEx(hwd,0,'TButton','&Yes'); if hwd>0 then begin SendMessage(hwd,BM_CLICK,0,0); end; end; end;
sdzeng: 我试了你的方法还是不行呀,我要控制关闭的那支程序的CLOSE里是这样写的: if MessageDLG('Do you want to quit?',mtConfirmation,mbOkCancel,0) = mrOK then 在控制程序里我的代码如下: SendMessage(smohandle2, WM_CLOSE, 0, 0);//会出现问你是否要退出的对话框 hwd := FindWindow('TMessageForm','Confirm');
if hwd>0 then begin hwd := FindWindowEx(hwd,0,'TButton','&Yes'); if hwd>0 then begin SendMessage(hwd,BM_CLICK,0,0); end;
hwd := FindWindowEx(hwd,0,'TButton','&Yes'); 查找的是Caption为&Yes按钮,你的代码用的是mbOkCancel,自然找不到了改成hwd := FindWindowEx(hwd,0,'TButton','OK');
我试过hwd := FindWindowEx(hwd,0,'TButton','OK');也不行呀
我也试过,是可以的 估计是你调用的问题你自己跟踪一下吧,看看是哪一句没有找到窗口句柄 都3条裤衩了,怎么跟踪调试应该不用教了吧 另外:SendMessage(smohandle2, WM_CLOSE, 0, 0); 改成PostMessage(smohandle2, WM_CLOSE, 0, 0);---------------------------------------- 这是我测试的代码,给你做个参考procedure TTestForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDLG('Do you want to quit?',mtConfirmation,mbOkCancel,0) <> mrOK then CanClose := False; end;procedure TForm1.Button2Click(Sender: TObject); var hwd : THandle; begin hwd := FindWindow('TTestForm',0); if hwd>0 then PostMessage(hwd,WM_CLOSE,0,0); end;procedure TForm1.Button1Click(Sender: TObject); var hwd : THandle; begin //Showmessage和MessageDlg的对话框类名是TMessageForm //如果是MessageBox的对话框,类名是#32770 hwd := FindWindow('TMessageForm','Confirm'); if hwd>0 then begin hwd := FindWindowEx(hwd,0,'TButton','OK'); if hwd>0 then begin SendMessage(hwd,BM_CLICK,0,0); end; end; end;
var
hwd : THandle;
begin
//Showmessage和MessageDlg的对话框类名是TMessageForm
//如果是MessageBox的对话框,类名是#32770
hwd := FindWindow('TMessageForm','Confirm');
if hwd>0 then
begin
hwd := FindWindowEx(hwd,0,'TButton','&Yes');
if hwd>0 then
begin
SendMessage(hwd,BM_CLICK,0,0);
end;
end;
end;
我试了你的方法还是不行呀,我要控制关闭的那支程序的CLOSE里是这样写的:
if MessageDLG('Do you want to quit?',mtConfirmation,mbOkCancel,0) = mrOK then 在控制程序里我的代码如下:
SendMessage(smohandle2, WM_CLOSE, 0, 0);//会出现问你是否要退出的对话框 hwd := FindWindow('TMessageForm','Confirm');
if hwd>0 then
begin
hwd := FindWindowEx(hwd,0,'TButton','&Yes');
if hwd>0 then
begin
SendMessage(hwd,BM_CLICK,0,0);
end;
查找的是Caption为&Yes按钮,你的代码用的是mbOkCancel,自然找不到了改成hwd := FindWindowEx(hwd,0,'TButton','OK');
估计是你调用的问题你自己跟踪一下吧,看看是哪一句没有找到窗口句柄
都3条裤衩了,怎么跟踪调试应该不用教了吧
另外:SendMessage(smohandle2, WM_CLOSE, 0, 0);
改成PostMessage(smohandle2, WM_CLOSE, 0, 0);----------------------------------------
这是我测试的代码,给你做个参考procedure TTestForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDLG('Do you want to quit?',mtConfirmation,mbOkCancel,0) <> mrOK then
CanClose := False;
end;procedure TForm1.Button2Click(Sender: TObject);
var
hwd : THandle;
begin
hwd := FindWindow('TTestForm',0);
if hwd>0 then
PostMessage(hwd,WM_CLOSE,0,0);
end;procedure TForm1.Button1Click(Sender: TObject);
var
hwd : THandle;
begin
//Showmessage和MessageDlg的对话框类名是TMessageForm
//如果是MessageBox的对话框,类名是#32770
hwd := FindWindow('TMessageForm','Confirm');
if hwd>0 then
begin
hwd := FindWindowEx(hwd,0,'TButton','OK');
if hwd>0 then
begin
SendMessage(hwd,BM_CLICK,0,0);
end;
end;
end;
一般我遇到这种问题是直接给那个窗口所在的线程用PostThreadMessage发WM_QUIT消息来关闭的, 它没机会弹出对话框
比如释放资源什么的,直接用WM_Quit就不会触发这些事件了