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
Windows中点击“关闭”button发生了什么?的更多相关文章
- django xadmin中logout页面在chrome浏览器中点击关闭页面无效
问题现象 django xadmin中logout页面在chrome浏览器中点击关闭页面无效,无法关闭相应的页面 问题原因 高版本的chrome等浏览器不支持在window.colse()的写法 问题 ...
- 各位客官!鼠标点击一个Button之后究竟发生了什么?您知道么?(C#)
在谈论主题之前,让我们先简单回顾下事件的基础知识吧! 我们知道事件有发出(raises)事件的源,即event sender,也有接收事件通知(notifications)的接收者,即event re ...
- Windows Server 2008关闭internet explorer增强的安全配置
服务器系统要求很高的安全性,所以微软给ie添加了安全增强.这就使得ie在Internet区域的安全级别一直是最高的,而且无法进行整体调整. 关闭IE SEC服务器系统要求很高的安全性,所以微软给ie添 ...
- (利用DOM)在新打开的页面点击关闭当前浏览器窗口
1.在开发过程中我们前端的用户体验中有时候会要求点击一个按钮,关闭当前浏览器窗口.用html DOM就可做到. 2.注意:本次写法要求在新窗口中关闭. target="_blank" ...
- (利用DOM)在新打开的页面点击关闭当前浏览器窗口
1.在开发过程中我们前端的用户体验中有时候会要求点击一个按钮,关闭当前浏览器窗口,用HTML DOM就可做到 2.注意:本次写法要求在新窗口中关闭.target="_blank" ...
- 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数
需求: 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数 过程: 一些应用软件可以通过点击URL链接启动并执行操作(例如迅雷),这是如何做到的呢? 主要是通过修改注册表,注册U ...
- Windows端口开启关闭
转至:https://www.cnblogs.com/shenyiyangle/p/10503754.html netstat-a #显示所有活动的TCP连接以及计算机监听的TCP和UDP端口. ne ...
- Duilib 实现窗口点击关闭确认退出提示
此功能是记住用户的操作,在用户点击关闭时是真退出程序还是最小化到托盘,我们常见的PC客户端都有此功能,例如:IMO客户端.网易云音乐 我自己的项目中也要实现此功能,在此总结一下,最终效果: .h文件 ...
- Android开发探秘之一:创建可以点击的Button
感觉到自己有必要学习下手机开发方面的知识,不论是为了以后的工作需求还是目前的公司项目. 当然,任何新东西的开始,必然伴随着第一个HelloWorld,Android学习也不例外.既然才开始,我就不做过 ...
随机推荐
- jQuery weui Select组件显示指定值
jQuery weui有个支持单选或者多选的select弹出层,默认他是这样的 第2部分选择什么值,第1部分就显示什么值,一般的场景支持是没问题了,但本次开发碰到了一个问题. 需求描述: 职业名称后面 ...
- debian 下的vi 上下左右键问题
小白一只,查了一下vi的版本信息 发现好像是vim 于是把~/.vimrc 变量设置了一下就好了。 将set compatible 设置成set nocompatible . 这是因为系统会默认vim ...
- 21、IIS声卡驱动程序
声卡芯片的数据通道一般都是IIS接口,但是控制音量等控制信息的接口都不相同 (新内核在linux-3.4.2\sound\soc\codecs\uda134x.c) uda134x_codec_pro ...
- Android基础新手教程——1.2 开发环境搭建
Android基础新手教程--1.2 开发环境搭建 标签: Android基础新手教程 如今主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio ...
- 简单的Java多线程的使用
前几天做一个功能.就是在前台更改信息后会自己主动发邮件给其它的人,相关信息已更改,刚開始是直接在更改信息代码后面增加发送邮件的代码,但发现这样会使界面特别慢,而慢的主要原因是因为发送邮件有时会耗时非常 ...
- JBoss AS 7之初步了解(The Return Of The King)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9obl9mX2xhdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- ios开发总结:Utils常用方法等收集,添加扩展类,工具类方法,拥有很多方便快捷功能(不断更新中。。。)
BOBUtils 工具大全 本人github开源和收集功能地址:https://github.com/niexiaobo [对ios新手或者工作一年以内开发人员很有用处] 常用方法等收集.添加扩展类. ...
- PHP移动互联网开发笔记(4)——自定义函数及数组
一.自定义函数 自定义函数就是我们自己定义的函数,在PHP中自定义函数格式如下: function funname(arg1, arg2, arg3......){ //TODO return val ...
- IDEA 多线程Debug
一.问题描述 在idea中的进行调试时,代码中有多线程,想对线程中的代码进行跟踪,代码如下: for (int i = 0; i < 5; i++) { final int index = i; ...
- Oracle数据库零散知识03
21,存储过程,简化复杂操作,增加数据独立性,提高安全性,提高性能 与函数创建对比: create or replace function fun_01(v_01 in number) return ...