Windows中点击“关闭”按钮发生了什么?看了一堆,挑出来质量比较高的

 ----------------------------------------------------------------------------------------------------------------第一篇-------------------------------------------------------------------------------------------------------------

    public const int WM_CLOSE = 0x10;

    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
    [DllImport("User32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


    IntPtr hwnd_win;
    hwnd_win = FindWindow(null, "窗体a");

    SendMessage(hwnd_win, WM_CLOSE, 0, 0);


----------------------------------------------------------------------------------------------------------------第二篇-------------------------------------------------------------------------------------------------------------

用户关闭软件时,软件一般会给“是否确认关闭”的提示。

通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭;否则把FormClosingEventArgs 的 Cancel 属性设置为 true,就取消了该窗体的关闭。

如果该窗体是主窗体,我们想在该窗体关闭时关闭整个应用程序,会遇到至少两种情况:

(1)该窗体同时是启动窗体,即它是应用程序中所有窗体的父类,则整个应用程序会被关闭。

(2)如果该窗体不是启动窗体,比如我们做了一个欢迎窗体,则应用程序中所有窗体的父类就是这个欢迎窗体了。这时该窗体的关闭并不会关闭整个应用程序。我们需要再加入“Application.Exit()”这行代码来退出应用程序。但同时又有问题了,父窗体的关闭又会给该窗体发送关闭事件,于是该事件又被调用一次,确认对话框又会弹出第二次。解决方法是用下面的代码:

注:做欢迎体界面可以在主窗体中,ShowDialog方法打开欢迎界面,而不是把欢迎界面作为启动窗体。下面的方法仅有理论意义。

复制代码
 1 protected override void WndProc(ref Message m)
 2         {
 3             //Console.WriteLine(m.Msg);
 4             const int WM_SYSCOMMAND = 0x0112;
 5             const int SC_CLOSE = 0xF060;
 6             if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
 7             {
 8                 //捕捉关闭窗体消息 http://www.cnblogs.com/sosoft/
 9                 //用户点击关闭窗体控制按钮   注释为最小化窗体   
10                 //this.WindowState = FormWindowState.Minimized;
11 
12                 //窗体隐藏
13                 this.Hide();
14                 return;
15             }
16             base.WndProc(ref m);
17         }
复制代码

***************************************************************************************************************

C# 窗体关闭时可以触发的事件

FormClosing :在窗体关闭时,FormClosing 事件发生。窗体关闭时,此事件会得到处理,从而释放与此窗体关联的所有资源。如果取消此事件,则该窗体保持打开状态。若要取消窗体的关闭操作,请将传递给事件处理程序的 FormClosingEventArgs 的 Cancel 属性设置为 true。

FormClosed:在用户或 Application 类的 Close 方法或 Exit 方法关闭窗体后,会发生 FormClosed 事件。若要防止窗体关闭,请处理 FormClosing 事件,并将传递给事件处理程序的 CancelEventArgs 的 Cancel 属性设置为 true。可以使用此事件执行一些任务,如释放窗体使用的资源,还可使用此事件保存输入窗体中的信息或更新其父窗体。

当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带 X 的按钮)会隐藏窗体并将 DialogResult 属性设置为 DialogResult.Cancel。通过在窗体的 FormClosing 事件的事件处理程序中设置 DialogResult 属性,可以在用户单击“关闭”按钮时重写分配给 DialogResult 属性的值。

注意
在显示为无模式窗口的 Form 上调用 Close 方法时,不能调用 Show 方法使窗体可见,因为窗体的资源已被释放。若要隐藏窗体然后又使其可见,请使用 Hide 方法。
 

如果窗体是多文档界面 (MDI) 父窗体,则在引发 MDI 父窗体的 FormClosing 事件之前将引发所有 MDI 子窗体的 FormClosing 事件。同样,在引发 MDI 父窗体的 FormClosed 事件之前,将引发所有 MDI 子窗体的 FormClosed 事件。取消 MDI 子窗体的 FormClosing 事件不能防止引发 MDI 父窗体的 FormClosing 事件。但是,取消该事件会将作为参数传递给父窗体的 FormClosingEventArgs 类的 Cancel 属性设置成 false。要强制关闭所有 MDI 父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置成 false。

下面一个简单例子:

复制代码
 1 private void Form2_FormClosing(object sender, FormClosingEventArgs e)  
 2 {  
 3     DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);  
 4     if (result == DialogResult.OK)  
 5     {  
 6         e.Cancel = false;  //点击OK
 7     }  
 8     else 
 9     {  
10         e.Cancel = true;  
11     }  
12 }
复制代码

----------------------------------------------------------------------------------------------------------------第三篇-------------------------------------------------------------------------------------------------------------


对于Windows操作,当用户点击"关闭"按钮时,窗口函数就会收到一个WM_DESTROY消息。

    窗口函数应该调用PostQuitMessage(0) 向消息队列插入一个WM_QUIT消息。GetMessage 如果从消息队列中取得的是WM_QUIT消息,它将返回0,从而导致消息循环结束,WinMain函数退出,整个应用程序退出。

     只要通过点击窗口右上角的“关闭”按钮,来关闭窗口并退出应用程序。能不能在结束应用程序之前弹出一个对话框,来确认一下我们的操作呢?

     要做到这一点,首先要了解单击“关闭”按钮开始,一直到最后应用程序退出到底发生了什么。其实,这是一个很“复杂”的过程,描述如下:

1)单击窗口右上角的“关闭”按钮,系统向消息队列插入WM_CLOSE消息;

2)窗口函数调用DefWindowProc 处理WM_CLOSE消息:调用DestroyWindow() 函数;

3)窗口关闭,并向消息队列插入WM_DESTROY消息;

4)窗口函数函数处理WM_DESTROY消息:调用PostQuitMessage 函数,向消息队列插入WM_QUIT消息;

5)主函数的消息循环中的GetMessage获取WM_QUIT消息返回0,导致消息循环结束,进而WinMain函数结束,再进而整个进程结束

     我们可以从这个过程中看到三个消息:WM_CLOSE、WM_DESTROY、WM_QUIT

     WM_CLOSE代表用户希望结束应用程序;WM_DESTROY代表窗口的关闭;WM_QUIT代表进程的结束。

     怎样在结束应用程序之前弹出一个对话框,来确认一下我们的操作呢?可以在WndProc 中添加对WM_CLOSE的消息处理。代码如下:

[cpp]  view plain  copy
  1. //窗口函数,用于消息处理  
  2. LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){  
  3.     int nSel=0;  
  4.     switch(msg){  
  5.         case WM_CLOSE:  
  6.             nSel=MessageBox(hWnd,L"你真的要退出吗?",szWindowTitle,MB_YESNO|MB_ICONQUESTION);  
  7.             if(nSel==IDYES) DestroyWindow(hWnd);  
  8.             return 0;  
  9.         case WM_DESTROY:  
  10.             PostQuitMessage(0);  
  11.             return 0;  
  12.         default:  
  13.             return DefWindowProc(hWnd,msg,wParam,lParam);  
  14.     }  
  15. }  


效果如下:

       


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值