我要写一支程序来控制另一支程序在规定的时间内关闭,但是要关闭的程序的CLOSE事件里有写MESSAGEDLG语句(即让你确认是否要退出的信息),我用SendMessage(handle, WM_CLOSE, 0, 0)去关闭时只能执行那支程序的CLOSE事件但实际上它还会跳出一个MESSAGE出来问你要不要退出,请问如何控制在它CLOSE跳出信息时自动按"YES"退出??

解决方案 »

  1.   

    if MessageDlg('确认推出吗?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
      

  2.   

    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;
      

  3.   

    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;
      

  4.   

    hwd := FindWindowEx(hwd,0,'TButton','&Yes');
    查找的是Caption为&Yes按钮,你的代码用的是mbOkCancel,自然找不到了改成hwd := FindWindowEx(hwd,0,'TButton','OK');
      

  5.   

    我试过hwd := FindWindowEx(hwd,0,'TButton','OK');也不行呀
      

  6.   

    我也试过,是可以的
    估计是你调用的问题你自己跟踪一下吧,看看是哪一句没有找到窗口句柄
    都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;
      

  7.   

    好麻烦
    一般我遇到这种问题是直接给那个窗口所在的线程用PostThreadMessage发WM_QUIT消息来关闭的, 它没机会弹出对话框
      

  8.   

    楼上属于粗暴型 :)WM_Quit比TerminateProcess好不到哪去在主窗口被Close以前可能会有其他事情要做,
    比如释放资源什么的,直接用WM_Quit就不会触发这些事件了