文章目录[隐藏]
GetMessage是Windows中最重要的函数之一,Windows的窗口程序的结构就是先通过调用GetMessage从消息队列中获取消息,然后再处理相应消息。而与GetMessage相似的还有一个函数——PeekMessage。下边就说说两者区别。
GetMessage与PeekMessage都是从消息队列中取得消息。
首先,PeekMessage比GetMessage多了个wRemoveMsg参数,用来指定是否取得消息后,从消息队列中删除该消息,而GetMessage在取得消息后必定从消息队列中删除该消息。
其次GetMessage被调用后,如果消息队列中没有消息,它会一直等待消息队列,直到消息队列中有新的消息出现,GetMessage获取该消息后才返回。
也就是说GetMessage执行后一定要获取一个消息,如果没有就一直等着。而PeekMessage则执行后,立即返回,不管有没有获取消息。
第三,由于GetMessage总是会获取消息,因此它是根据消息决定返回值的,当获取的是WM_QUIT消息时,返回值为非0,当获取的不是WM_QUIT消息时,返回值为0,当执行失败时,返回值为-1。
而对于PeekMessage来说,它不管有没有消息,都是立即返回,因此它就根据有没有获取消息来决定返回值,当获取消息时,返回值为非0,当没有获取消息时,返回值为0。
在多数场合,我们都用GetMessage来获取消息。
但在一些特殊场合,会用到PeekMessage。
例如有时候我们程序中要判断用户在一段时间内是否按过某个健(注意,是"是否"按过某个键,而不是"如果"按过某个键),对于这种应用,由于并不需要处理按键,因此用PeekMessage更好。
因此,GetMessage一般用于获取消息,PeekMessage一般用于检测消息。
检查消息队列PeekMessageA
.版本 2 .DLL命令 检查消息队列_, 整数型, "user32.dll", "PeekMessageA" .参数 消息格式, 消息_, , lpMsg .参数 窗口句柄, 整数型, , hWnd .参数 消息最小过滤值, 整数型, , wMsgFilterMin .参数 消息最大过滤值, 整数型, , wMsgFilterMax .参数 删除消息, 整数型, , wRemoveMsg,是否取得消息后,从消息队列中删除该消息
等待消息WaitMessage
.版本 2 .DLL命令 等待消息_, 整数型, "user32.dll", "WaitMessage"
注册热键RegisterHotKey
.版本 2 .DLL命令 注册热键_, 整数型, "user32.dll", "RegisterHotKey" .参数 窗口句柄, 整数型, , hWnd .参数 热键id, 整数型, , id .参数 功能键, 整数型, , fsModifiers .参数 主热键, 整数型, , vk
取消热键注册UnregisterHotKey
.版本 2 .DLL命令 取消热键注册_, 整数型, "user32.dll", "UnregisterHotKey" .参数 窗口句柄, 整数型 .参数 热键id, 整数型
等待消息WaitMessage
.版本 2 .DLL命令 等待消息_, 整数型, "user32.dll", "WaitMessage"
自定义数据类型msg
.版本 2 .数据类型 消息_, , Msg .成员 窗口句柄, 整数型, , , hWnd .成员 消息号, 整数型, , , Message .成员 附加参数1, 整数型, , , wParam .成员 附加参数2, 整数型, , , lParam .成员 发送时间, 整数型, , , time .成员 光标横坐标, 整数型, , , x .成员 光标纵坐标, 整数型, , , y
常量值
.版本 2 .常量 MOD_ALT, "1" .常量 MOD_CONTROL, "2" .常量 MOD_SHIFT, "4" .常量 PM_REMOVE, "1" .常量 WM_HOTKEY, "786"
主程序调用
设置一个程序集变量:程序集_标志位,类型:逻辑型
.版本 2
.子程序 _按钮_检查消息队列_被单击
程序集_标志位 = 假
注册热键_ (取窗口句柄 (), 0, #MOD_CONTROL, #F键)
标签_提示.标题 = “按下CTRL+F键最小化窗口”
子程序_等待消息 ()
.子程序 子程序_等待消息
.局部变量 局部_消息结构, 消息_
.判断循环首 (取反 (程序集_标志位))
等待消息_ ()
.如果真 (检查消息队列_ (局部_消息结构, 取窗口句柄 (), #WM_HOTKEY, #WM_HOTKEY, #PM_REMOVE) ≠ 0)
.判断开始 (_启动窗口.位置 = 0)
_启动窗口.位置 = 2
.默认
_启动窗口.位置 = 0
.判断结束
.如果真结束
处理事件 ()
.判断循环尾 ()
.子程序 __启动窗口_可否被关闭, 逻辑型
程序集_标志位 = 真
取消热键注册_ (取窗口句柄 (), 0)