- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析比对,有助于读者更好的对消息投递函数加以理解。详情如下:
1、WM_CLOSE、WM_DESTROY、WM_QUIT区别 。
WM_CLOSE:关闭应用程序窗口 。
WM_DESTROY:关闭应用程序 。
WM_QUIT:关闭消息循环 。
只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失).
win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用DestroyWindow函数,发送WM_DESTROY消息。此消息处理中调用PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。GetMessage捕获到WM_QUIT,返回0,退出循环(应用程序真正退出)。 注意:按照上述正常流程,WM_QUIT是不会到达窗口过程的。(因为在GetMessage截获了WM_QUIT消息之后,程序已经彻底退出了!) 。
MFC应用程序的完整退出过程:点击窗口右上角的关闭按钮,或选择【File/Close】,发出 WM_CLOSE消息。CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。预设函数对于WM_CLOSE 的处理方式是呼叫 ::DestroyWindow, 并因而发出WM_DESTROY。预设之WM_DESTROY 处理方式是呼叫::PostQuitMessage,因此发出WM_QUIT。CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路, 然后呼叫ExitInstance,这是CWinApp 的一个虚拟函数。如果自己应用程序类CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。最后回到 AfxWinMain,执行 AfxWinTerm,结束程序.
附加:当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。 WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息. 相关代码分析:
1
2
3
4
5
6
|
//主函数中进入消息循环的代码片断
while
(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
//将消息进行处理一下
DispatchMessage(&msg);
//再将消息变量msg传给windows,让windows来调用消息处理函数
}
|
如果把GetMessage(&msg,NULL,0,0)改为GetMessage(&msg,hWnd,0,0),则发现关闭应用程序后,任务管理器中仍有该程序的进程,且占用大量的内存,why?
msdn中的原因解释是:对于GetMessage(&msg,hWnd,0,0),当第二个参数无效时,此函数返回值为-1。对于上述循环来说,此while条件为真,因此进入死循环,进程无法退出.
2、各种消息投递函数 。
1、SendMessage:发送消息给指定的窗口过程;直到窗口过程处理了消息才返回。 2、PostMessage:将消息放入消息队列(与指定窗口创建的线程相关)中;无需等待消息处理,立即返回。 不能发送WM_QUIT消息,此消息只能由PostQuitMessage函数发送。 3、PostThreadMessage:发送消息给指定线程的消息队列;无需等待线程处理消息,立即返回。 此函数发送的消息和窗口是无关的。我们只需指定线程ID就OK了,但要保证线程已创建,否则会失败。 4、GetMessage:从调用线程的消息队列中取消息。 当第二个参数为NULL时,它检索以下两种消息: a、属于调用线程的任何窗口的消息; b、由PostThreadMessag投递给该调用线程的消息。 5、PeekMessage:功能同GetMessage。区别是: GetMessage:直到一个匹配了过滤条件的消息,被放到消息队列中才返回。 PeekMessage:不管消息是否放入队列,立即返回。 6、DispatchMessage:派遣消息给相应的窗口过程。 7、TranslateMessage:转换虚拟键信息到字符消息.
最后此篇关于WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解的文章就讲到这里了,如果你想了解更多关于WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在为自定义对话框使用特殊的消息循环。当对话框打开并且窗口关闭时,我想达到下面的第二个 if(msg.message == WM_CLOSE)。 for(;;) { if(PeekMessa
本文对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析比对,有助于读者更好的对消息投递函数加以理解。详情如下: 1、WM_CLOSE、WM_DEST
我正在创建一个简单的 C# 应用程序来监视服务器上的公开应用程序,如果有任何消息框出现一个特定的窗口名称,则关闭该窗口并继续该过程。供应商随机出现信息消息框,它会挂起应用程序,直到单击 X 或 OK
我将子 hwnd 创建为带有关闭按钮的弹出窗口,并使用 WndchildProc 来处理来自子窗口的消息 m_childHwnd = CreateWindowEx( NULL, TEXT("STATI
我想“保护”某个窗口不被关闭。所以我想 Hook WM_CLOSE、WM_DESTOY 或 WM_QUIT。这就是我尝试这样做的: LRESULT CALLBACK WindowHookProc(in
我正在尝试从 C++ 应用程序关闭 C# .NET 4 WPF 应用程序。 C++ 应用程序使用枚举窗口的标准技术,找到对应于给定进程 ID 的窗口,通过 PostMessage 向窗口发送 WM_C
我知道在 Windows 通知消息中,WM_CLOSE 指的是通过窗口右上角的“X”按钮关闭窗口。 有谁知道用 File->Exit 关闭的通知消息? 我问的原因是因为我正在尝试实现 JNI nati
如何编写一个 WinForms 应用程序,它除了托盘图标外没有任何可见元素,同时允许该应用程序在文件正在使用时由 Windows Installer 关闭?据我了解,Windows Installer
当模态对话框处于事件状态时,主应用程序窗口是否可以检测到 WM_CLOSE 事件?。如果没有,是否有任何方法可以检测到 WM_CLOSE 事件,因为对话框的事件处理程序也没有检测到它。 要亲自观察此行
开始一个进程- ProcessStartInfo psi = new ProcessStartInfo("G:\\SampleWinApp.exe"); psi.UseShe
我有一个调用我的应用程序的外部应用程序,应该在工作完成后结束它。来自此外部应用程序的日志声称它在我的应用程序上使用了 WM_CLOSE。 如何在我的应用程序中截取 WM_CLOSE 消息来执行一些清理
我正在使用 Tray 应用程序。 Onj FormCloseQuery 我检查程序是否应该转到托盘,而不是关闭它,而是将其放入托盘中(CanClose := False) 但是,如果 Windows
我只想知道这两个消息常量有什么区别。覆盖时,我应该在 WndProc 方法中使用哪一个来处理关闭按钮消息。 最佳答案 WM_CLOSE无论何时以任何方式请求关闭窗口,都会作为窗口消息发送。 SC_CL
我只想知道这两个消息常量有什么区别。覆盖时,我应该在 WndProc 方法中使用哪一个来处理关闭按钮消息。 最佳答案 WM_CLOSE无论何时以任何方式请求关闭窗口,都会作为窗口消息发送。 SC_CL
当我使用 DialogBox 创建对话框时, 它不会关闭,除非我在我自己的 DLGPROC 函数中处理 WM_CLOSE 并调用 EndDialog。 我知道这是设计使然,但我很感兴趣为什么选择 WM
我创建了简单的 handler inside my QApplication : bool QtMyApplication::winEventFilter ( MSG * msg, long * re
我有一个基于对话框的 MFC 应用程序,它需要停止 Windows Wifi 服务才能正常运行,但我想在我的应用程序退出时再次启用它。 所以我想我应该将重启服务的代码放在主对话框类的析构函数中。 现在
我正在调用 HtmlHelpA winapi 方法来显示我的应用程序的 .chm。此方法立即返回一个 HWND,并且帮助窗口显示为一个单独的窗口。 除了窗口,我还为这个 hwnd 设置了一个计时器。我
尝试在 Windows 7 的任务栏缩略图中使用关闭按钮关闭窗口时尝试设置“你想保存吗”对话框(启用 aero peek)。 在处理 WM_CLOSE 时使用 MessageBox() 不起作用。 M
我们有一个遗留的 C Windows 应用程序,它在发生致命连接错误时通过 MessageBox 调用弹出一个模式窗口。我们的网络工程师可能同时运行其中的许多应用程序。有时,网络故障会导致这些应用程序
我是一名优秀的程序员,十分优秀!