Windows应用程序的退出

Windows应用程序的退出

flyfish

OnOK OnCancel EndDialog的关系

VC\atlmfc\src\mfc\dlgcore.cpp文件中

void CDialog::OnOK()
{
	if (!UpdateData(TRUE))
	{
		TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n");
		// the UpdateData routine will set focus to correct item
		return;
	}
	EndDialog(IDOK);
}

void CDialog::OnCancel()
{
	EndDialog(IDCANCEL);
}

void CDialog::EndDialog(int nResult)
{
	ASSERT(::IsWindow(m_hWnd));

	if (m_nFlags & (WF_MODALLOOP|WF_CONTINUEMODAL))
		EndModalLoop(nResult);

	::EndDialog(m_hWnd, nResult);
}

消息路由是

OnOK-》EndDialog

OnCancel-》EndDialog

用户点击确定或者取消按钮时收到两个消息IDOK或IDCANCEL,执行OnOK或者OnCancel,然后调用函数EndDialog来结束对话框。

win32应用程序的退出

// 主消息循环:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 分析菜单选择:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 在此添加任意绘图代码...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

1 程序运行的过程中,不断以GetMessage从消息队列中抓取消息。如果这个消息是WM_QUIT,GetMessage会传回0而结束while循环,进而结束整个程序。

2 DestroyWindow 发送 WM_DESTROY消息

3 程序对WM_DESTROY的标准反应是调用PostQuitMessage。

4 PostQuitMessage发送WM_QUIT消息,准备让消息循环中的GetMessage取得这消息,结束消息循环。

消息路由是

DestroyWindow-》WM_DESTROY-》PostQuitMessage-》WM_QUIT

点击标题栏关闭按钮时发送WM_CLOSE 消息,WM_CLOSE 消息调用 DestroyWindow 函数.

消息路由是

WM_CLOSE-》DestroyWindow

在线程中退出应用程序

在基于对话框程序中,创建一个线程
AfxBeginThread(ProcessThread,this);
线程函数
UINT CXDlg::ProcessThread(LPVOID pParam)
{

	CXDlg *pDlg=static_cast<CXDlg*>(pParam);
	if (NULL==pDlg)return 1;
//这里调用退出函数
}

退出函数无论执行OnOK(),OnOK()或者PostQuitMessage(0); 应用程序都没有退出

在线程中传递的是窗口指针,而不是窗口句柄

while (GetMessage( lpMsg, hWnd, 0, 0)) 相当于hWnd是无效的

PostQuitMessage函数发送一个WM_QUIT消息到线程消息队列并且立即返回.该函数简单的通知系统线程请求马上退出

GetMessage中的参数hWnd是无效的窗口句柄或lpMsg是空指针时。GetMessage返回值是-1。

所以需要获取句柄,调用AfxGetMainWnd()->SendMessage(WM_CLOSE);

时间: 2024-10-09 09:29:45

Windows应用程序的退出的相关文章

Windows控制台程序“选定模式”的问题

最近用Nodejs写了个代理程序,一直用的好好的,木有问题,今天突然发现不能用了,使用telnet去连代理的端口也能连通,可是服务就是不能正常使用,提示连接超时. 当时猜测是Nodejs的某个地方阻塞了,分析了下代码,怎么也想不明白不能有阻塞的地方啊. 又是各种倒腾,后来发现一个奇怪的问题,我把鼠标放到Nodejs的控制台上,默认进入了编辑模式,而且整个应用的标题变成了"选定 XXXX"这种形式,我想退出程序,需要按两次Ctrl+C,难道是这的问题? 又来有测试了下,果真还是这的问题,

基本的Windows应用程序 窗体创建

基本的Windows应用程序 转载:http://shiba.hpe.sh.cn/jiaoyanzu/WULI/Article1506 下面是一个完全可以运行的Windows程序,代码很简单,读者通过代码中的注释了解它们的含义.我们将在下一节详细讲解些代码.做为一个练习,我们建议读者在你的开发工具中创建一个工程,手工输入些代码,然后编译运行这个程序.注意,如果你使用的是Visual C++,那么在选择工程类型时必须是“Win32 application project”,而不能是“Win32 c

WP开发笔记——程序的退出方法

Windows Phone程序中,并没有之前的类似于"App.Exit()"之类的函数用来让你退出程序.这是怎么回事儿呢? 很简单,在Windows Phone 7中系统要求配备了硬件的"Back"键,该键用于在程序中导航(返回)到上一个页面(屏幕)或者应用程序. 当菜单.对话框.搜索框.虚拟键盘等打开时,点击它则关闭菜单.对话框.搜索框和虚拟键盘等. 当应用程序停留在该程序的第一个界面的时候,如果按下返回键,则该程序会自动关闭并回到打开该程序的上一个界面. 由于该

Windows应用程序运行机制(笔记)

Windows应用程序:以windows作为平台运行的应用程序. API函数 API函数:windows提供了大量可以在应用程序中调用的,用C语言编写的函数. Windows API 函数的功能如下: 1.窗口管理函数:实现窗口的创建.移动和修改等功能. 2.图形设备函数:实现图形的绘制及操作功能,这类型函数的集合又叫做图形设备接口. 3.系统服务函数:实现与操作系统有关的一些功能. 窗口与句柄 在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的:要对某个窗口进行操作,就必须要得

【系统篇】从int 3探索Windows应用程序调试原理

探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程序不处于调试状态则会弹出一个错误信息,之后程序就结束.使用VC开发程序时,在Debug版本的程序中,编译器会向函数栈帧中填充大量的0xCC,用于调试使用.因此,经常我们的程序发生缓冲区溢出时,会看到大量的“烫烫烫…”,这是因为“烫”的编码正是两个0xCC. 那么?为什么int 3可以让程序中断到调试

安装win7系统是提示:windows安装程序无法将windows配置为在此计算机的硬件上运行

博文转载自 Afeia , 版权归原作者所有. 该文解决了笔者的问题,故此转载之,希望能解决更多人的问题. 安装WIN7系统出现:”windows安装程序无法将windows配置为在此计算机的硬件上运行”,如下图: 解决办法: 当出现如上提示的时候,按下shift+f10 会打开命令窗口, 进入到C:\windows\system32\oobe文件夹,输入msoobe回车然后输入msoobe即可进入下一步操作. 但错误提示框仍然在,不用理会.按照屏幕提示输入相应的信息直至完成系统的安装.安装好后

利用钩子函数来捕捉键盘响应的windows应用程序

一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数.因此本文将对钩子函数的相关知识进行阐述.当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述.(本文的程序为vc6.

使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍

使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍 Windows MobileMobileWindowsMicrosoftWinForm 介绍 Microsoft Visual Studio 2008 专业版或者更高版本提供了一个Windows Mobile程序开发环境,允许你使用本地代码(C / C++)或托管代码(C# / Visual Basic.NET)为Windows Mobile设备创建程序. 这篇文章将带你正确的安装Visual Studi

C#关于软件界面无响应、BUG报警、程序异常退出等情况的监控和报警

对程序的监控,一般采用另外一个进程进行监控(即主进程和监控进程),主进程运行后,先查找下看有没有还在残留运行的监控进程,如果有先结束监控进程,然后重新启动. 如何监控主程序的思路是:主程序中开辟一个共享内存映射文件,通过定时器向文件写入变化的信号数据(自定义).监控程序定时从共享内存文件中读取信号数据,并和上次读取的信号数据进行对比,如果不一致表示主程序运行正常,如果不一致,表示运行异常或者程序异常退出. 内存映射文件 内存映射文件是由一个文件到进程地址空间的映射. C#提供了允许应用程序把文件