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

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

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

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

要做到这一点,首先要了解单击“关闭”button開始,一直到最后应用程序退出究竟发生了什么。事实上,这是一个非常“复杂”的过程,描写叙述例如以下:

1)单击窗体右上角的“关闭”button,系统向消息队列插入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

时间: 2024-11-07 12:46:32

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

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

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

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

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

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

Windows下如何关闭占用某一端口的程序与服务(转载)

今天使用JBoss服务器,它的端口被占用了,因此总是发生JVM的端口冲突的异常,但我又不知道到底是哪位大仙在这个8080端口上作怪,怎么办呢,下面提供一种简单可行的方法 1. 检测端口是否被占用:(命令行) netstat -an 2. 查看各端口上的服务:(命令行) fport         // 这时我检测到我的8080端口由p2pSvr占用(热狗之类的程序的吧) 注:fport是Windows2000自带的工具,XP上没有,上网下一个就可以 3. 关闭检测到的服务或进程 若是服务,则可:

bug:在label中包含img,在IE中点击图片的时候,radio没有被选中,别的浏览器可以

bug:在label中包含img,在IE中点击图片的时候,按钮没有被选中,别的浏览器可以 代码如下: 1 <td class="left"> 2 <input type="radio" name="sex" id="boy"/> 3 <label for="boy" disabled=""><img src="images/boy.jp

ios调用Html内JS alert 不能点击关闭为甚?

ios调用Html内JS alert 不能点击关闭为甚? This question gave me the most insight to the problem... Deadlock with GCD and webView The gist is that the thread handling the JS from the stringByEvaluatingJavaScriptFromString: method and the thread handling the iOS al

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&

Javascript中点击(click)事件的3种写法

方法一 <!DOCTYPE html> <html> <head> <title>Javascript中点击事件方法一</title> </head> <body> <button id="btn">click</button> <script type="text/javascript"> var btn = document.getElemen

Android中点击事件的四种写法详解

Android中点击事件的四种写法使用内部类实现点击事件使用匿名内部类实现点击事件让MainActivity实现View.OnClickListener接口通过布局文件中控件的属性 第一种方法:使用内部类基本步骤如下: 新建一个MyOnClickListener类并实现View.OnClickListener接口 重写View.OnClickListener接口中的OnClick(View view)方法 给Button绑定一个监听器,并监听一个点击事件示例代码如下: public class