网站首页 > 技术教程 正文
1.Windows C++消息循环处理
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg); //消息转化
DispatchMessage(&msg); //消息派遣. 把TranslateMessage转换的消息
//发送到窗口的消息处理函数,此函数在窗口注册时已经指定
}
消息循环执行过程:
- 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(这时程序会阻塞)。
- 如果有事件发生时导致有一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。
- 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。
- DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。
- 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。
- 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。
2.函数说明
2.1 GetMessage()
函数功能描述:
GetMessage 函数的作用是从当前线程的消息队列里获取一个消息并填入 MSG 结构 中。
该函数只能获取调用线程的消息,不能获得其他线程的消息。成功获取消息后,线程将从消息队列中删除该消息。
使用 GetMessage 函数,如果消息队列为空,函数会一直等待直到有消息到来才有返回值。
BOOL WINAPI GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:
---如果函数取得WM_QUIT之外的其他消息,返回非零值。
---如果函数取得WM_QUIT消息,返回值是零。
---如果出现了错误,返回值是-1。
例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。
2.2 TranslateMessage()函数
函数功能描述:
该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
BOOL TranslateMessage( CONST MSG*lpMsg );
参数:
IpMsg:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息。
返回值:
---如果消息被转换(即,字符消息被寄送到调用线程的消息队列里),返回非零值。
---如果消息是WM_KEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值,不考虑转换。
---如果消息没被转换(即,字符消息没被寄送到调用线程的消息队列里),返回值是零。
备注:此函数不修改由参数IpMsg指向的消息。
2.3 DispatchMessage()函数
函数功能描述:
该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得或者TranslateMessage函数传递的。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。
LONG DispatchMessage(CONST MSG*lpmsg);
参数:
lpmsg:指向含有消息的MSG结构的指针。
返回值:
返回值是窗口程序返回的值。
尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。
备注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IParam指向的函数,而不是调用窗口程序。
猜你喜欢
- 2024-10-25 Auto CAD 常用系统变量 cad2020系统变量
- 2024-10-25 做开发十年,我总结出了这些开发经验
- 2024-10-25 Windows高级工程师:GDI/GDI+绘图;基础入门大全
- 2024-10-25 菜比手把手教你破解游戏多开(轻喷)
- 2024-10-25 JVM 完整深入解析 jvm解析阶段
- 2024-10-25 Linux打开的文件过多Too many open file
- 2024-10-25 一文看完Oracle数据库之PGA概念、组成、自动管理、参数及视图
- 2024-10-25 JavaScript 中内存泄漏的原因以及对策
- 2024-10-25 史上最全Oracle文件损坏处理办法(附实验步骤)
- 2024-10-25 详解Oracle数据库PGA概念、组成、自动管理、参数及视图
你 发表评论:
欢迎- 01-09单因素方差分析+作图
- 01-09描述性统计分析 之 均值分析
- 01-0986:重复性和再现性分析GRR(2)-GRR均值极差分析法和方差分析法
- 01-09SPC如何做方差分析,意义又在哪里?
- 01-09MedSPSS小课堂——多因素方差分析
- 01-09MedSPSS小课堂——双因素方差分析
- 01-09SPSS单因素方差分析的操作步骤及结果解读,陈老师SPSS数据分析
- 01-0914单因素方差分析:One-Way ANOVA
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)