Windows中点击“关闭”按钮发生了什么?

对于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的消息处理。代码如下:

//窗口函数,用于消息处理
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
	int nSel=0;
	switch(msg){
		case WM_CLOSE:
			nSel=MessageBox(hWnd,L"你真的要退出吗?",szWindowTitle,MB_YESNO|MB_ICONQUESTION);
			if(nSel==IDYES) DestroyWindow(hWnd);
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		default:
			return DefWindowProc(hWnd,msg,wParam,lParam);
	}
}

效果如下:

关于窗口函数与消息处理机制:  http://blog.csdn.net/sanqima/article/details/34427471

http://blog.csdn.net/sanqima/article/details/32179711

Windows中点击“关闭”按钮发生了什么?,布布扣,bubuko.com

时间: 2024-10-10 16:17:23

Windows中点击“关闭”按钮发生了什么?的相关文章

Windows中点击“关闭”button发生了什么?

对于Windows操作,当用户点击"关闭"button时,窗体函数就会收到一个WM_DESTROY消息. 窗体函数应该调用PostQuitMessage(0) 向消息队列插入一个WM_QUIT消息.GetMessage 假设从消息队列中取得的是WM_QUIT消息,它将返回0,从而导致消息循环结束,WinMain函数退出,整个应用程序退出. 仅仅要通过点击窗体右上角的"关闭"button,来关闭窗体并退出应用程序.能不能在结束应用程序之前弹出一个对话框,来确认一下我们

django xadmin中logout页面在chrome浏览器中点击关闭页面无效

问题现象 django xadmin中logout页面在chrome浏览器中点击关闭页面无效,无法关闭相应的页面 问题原因 高版本的chrome等浏览器不支持在window.colse()的写法 问题源码 在xadmin的templates的xadmin的views的logged_out.html中找到以下源码 <a href="#" onclick="javascript:window.opener=null;window.open('','_self');windo

EasyUI 中点击取消按钮关闭Dialog(对话框窗口)

1.在取消按钮里的function中通过id找到这个对话框所在的层, 2.点出这个对话框,然后在括号了写入关闭的方法 <div id="dl1" class="easyui-dialog" title="窗口" style="width:400px;height: 200px" data-options=" toolbar:[ { text:'添加', iconCls:'icon-add', handler:f

Android 手机卫士--安装过程中点击回退按钮

本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再说”,而是选择点击回退按键,那么这时候的逻辑应该是让用户进入home界面而不是splash界面.所以需要添加代码逻辑来控制,添加的代码如下: builder.setOnCancelListener(new OnCancelListener() { @Override public void onCa

C++ windows图形界面,点击Button按钮通过openFileDialog控件选择文件

一直没用C++写过图形界面,之前用C#写很简单啊,没想到今天用C++还是有点不爽! 第一个问题,就是点击一个按钮button,选择文件,非文件夹,是文件,就是图片之类的东西! 首先,可以在界面中拖一个openFileDialog控件,控件名字就叫openFileDialog1,如图所示 也可以在Button的点击事件里new一个openFileDialog控件也可以! 然后,就是在button点击事件里,写下相应的代码就可以了: private: System::Void button1_Cli

WinForm中如何判断关闭事件来源于用户点击右上角的“关闭”按钮

在C#的WinForm程序中,有的时候需要判定关闭请求从哪里发出来的.比如是用户点击了右上角的“关闭”按钮,还是调用了WinForm.Close()方法.最典型的是要知道点击右上角的“关闭”按钮发出的事件.下面这个方法可以判断这点: 程序代码 protected override void WndProc(ref Message msg) {         const int WM_SYSCOMMAND = 0x0112;         const int SC_CLOSE = 0xF060

jquery实现&lt;body&gt;中点击按钮后,在&lt;tbody&gt;中显示一连串文本框

HTML中的代码如下: 1 <div style="background:#fff;border-style:solid; border-width:1px 1px 0 1px;border-color:#B8D0D6;"> 2 <div > 3 <div style="margin:-6px 0 0 0"> 4 <button class="button gray" type="button&

iOS中点击按钮跳转到外部浏览器和内部打开

如图所示,需要实现点击一个按钮,跳转到指定网页: -(void)pushBtnCellClickDeleate{ NSLog(@"跳转"); //在APP内部打开指定网页 UIWebView *myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)]; N

转 点击关闭时最小化到任务栏

来源:http://www.2cto.com/kf/201401/274489.html 现在很多软件如360杀毒软件.酷狗音乐都拥有最小化至任务栏并在系统托盘区留下图标,我的项目同样需要该功能.所以本文主要叙述如何使用C#让窗体最小化至任务栏,同时在系统托盘区的图标点击左键能显示窗体,右键能关联控件显示3个常用功能.主要涉及到的控件是NotifyIcon和ContextMenuStrip,此类文章较多,希望作者以自己的独特视角给予大家帮助. 一.界面操作 1.创建"Windows窗体应用程序&