WINDOWS CE的消息处理机制

 WINDOWS CE的消息处理机制(一) -q>Q
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  V;z
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  0HUK=G
学习过windows编程的人,都明白windows的消息处理机制,在Windows CE中继承了这种机制。"BAHNm
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  |* QF
为了能够获得消息,需要调用GetMessage函数na4!g
通常一个工程在消息循环中调用GetMessage函数rjp[^
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  <6
下面的代码,显示了如何在消息循环中调用GetMessage函数at6Dm$
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  #Dxy4(
while (GetMessage(&msg, NULL, 0, 0)) S_
{©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  wp yqO
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  BJ
TranslateMessage(&msg);/r*&%
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地   >Q
DispatchMessage(&msg);M9_
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  yBo
}©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  M
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  r|{0@
当一个线程调用GetMessage函数时,Windows CE检测消息队列,Windows CE按照以下的步骤处理消息:~
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  )Q>
(1)Windows CE检测消息队列,这些消息是通过SendMessage函数产生的。当系统从消息队列提取消息后,它通过GetMessage函数将消息发送到适当地窗体过程,这样就可以保证消息的发送和接收保持同步。必须通过调用GetMessage函数才能保证消息被处理。j
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  77.
(2)如果没有通过SendMessage得到的消息,Windows CE检测由PostMessge发送的消息队列。T
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  ~h
(3)如果没有通过PostMessage得到的消息,Windows CE检测用户用户输入消息。SOB
在处理用户输入消息时,系统保证在处理下一个消息以前已经处理结束前一个输入的消息。vWAo}D
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  S(
(4)如果没有用户输入消息,Windows CE检测WM_QUIT消息,该消息是由PostQuitMessage函数发送的。Qo
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  B4kx^
(5)如果没有WM_QUIT消息,Windows CE检测WM_PAINT消息。8D
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  hq-/
(6)如果没有WM_PAINT消息,Windows CE检测WM_TIMER消息P~
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  EQ3oi<
当GetMessage接收到任何消息,它返回消息的内容,该线程必须调用DispatchMessage函数来把消息发送到正确的窗体处理过程。如果这个消息是WM_QUIT消息,GetMessage函数的返回值为0,触发线程结束消息循环。a<bi
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  W~{
系统处理的消息是通过GetMessage函数在消息循环中的调用,又通过在消息循环中调用DispatchMessage函数来处理分派消息。z[5N-X
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  +n]
在通过DispatchMessage函数分发通过GetMessage得到的函数以前,用户可能需要处理这些消息,最常用的函数就是TranslateMessage, TranslateAccelerator, 和IsDialogMessage这三个函数。其中的一些函数可以自己分发消息,这样就必再次调用DispatchMessage来分发消息。 #-
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  58
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  X]
WINDOWS CE的消息处理机制(二)Qi2K
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  p4'N
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  ^hh|k-
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  YC>C$
用户通常使用TranslateMessage函数。该函数可以决定哪些字符对应相应的键盘消息。该函数同时也可以将字符发送到消息队列中,让下一次消息循环继续处理。9Y8
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  @
截取键盘消息产生菜单命令,用户可以调用TranslateAccelerator 函数,要对无模式对话框进行适当的操作需调用IsDialogMessage函数。RGc
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  (JPdm
下面的例子向用户显示一个消息循环的例子,它使用到了DispatchMessage函数, TranslateMessage函数, TranslateAccelerator函数,和IsDialogMessage函数以及GetMessage函数。A
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  1w24
while (GetMessage(&msg, NULL, 0, 0)) 3-X
{©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  p-|X
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  0y
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) fvF(N
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  ]yQ
{©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  2q+nz
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地   VFnm`
if (hwndDLGCurrent != NULL || !IsDialogMessage(hwndDLGCurrent, ^S[
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  5)fP$
&msg)) wnJY
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  F|hLn
{©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  Jn/Q
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  J{_g
TranslateMessage(&msg);)zJ}
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  ;<
DispatchMessage(&msg);/?FQ
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  /::
}©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  bo
}©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地   *4<O
}©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  :P"ayE
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  Hr
用户可以通过GetMessage函数取得消息队列中的事件,并且从消息队列中去除该消息,用户也可以用PeekMessage函数从一个消息队列中获得消息,但却不必从消息队列中去除它。hSk"
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  a*zm5
通过该函数可以把有关消息的信息填充到MSG结构中。使用PeekMessage函数时要小心,因为它并不会阻止消息的等待,这样一个程序就会不管消息队列中是否有消息而不停地运行,这样CPU就不会处于low-power 模式,从而导致电池用电量过大。ONVa4`
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  =qEGI
当处理消息的时候,Windows CE不仅支持系统定义的消息同时也支持用户自定义的消息。系统消息定义从0到0x3ff,用户可以使用0x400到0x7fff定义自己的消息。Windows CE把0x400定义为WM_USER。如果用户想定义自己的一个消息。可以在WM_USER上加上一个值。下面的过程讲述了如何进行自定义消息。=''5
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  |Dvv
#define WM_MYNEWMESSAGE (WM_USER + 999)@
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  4* _j"
有两种系统定义的消息,一种是窗体消息,使用于所有的窗体,还要一种是特殊目的的消息,应用于一定的窗体类。通常的窗体消息覆盖的范围非常大,包括输入设备和一些键盘的消息,同时也包括一些如窗体建立和管理的消息。 一定的消息包含有特定的前缀,比如说,一个通常的WINDOWS消息通常以WM开头,属于按钮的消息通常以BM开头。?Fy
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  >;/D
用户可以定义自己的消息,如果定义消息,一定要保证窗体过程争取地接收和解释消息,因为操作系统不会自动地处理用户定义的消息。8fEj
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  /u$
偶尔,用户也需要通过消息和别的进程中的休息保持通信。这种情况下,用户必须通过调用RegisterWindowMessage 函数来注册一个消息句柄。这样就可以保证消息号在整个系统中是唯一的,从而避免了不同的进程使用相同的消息号,造成冲突。p`x
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  O"QN
Windows CE不支持钩子函数,因为钩子函数需要的额外进程会不利于WINDOWS CE的执行。8q@d
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  >#p
在一个程序中处理消息序列时,请注意WM_HIBERNATE 消息。WINDOWS CE在系统资源不足时,通过WM_HIBERNATE 消息来通知应用工程。当一个工程接受到这个消息,它就会尽可能地释放资源。系统每隔五秒钟检测一次系统内存状态。pkt|Un
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  /tcusJ
每一个WINDOWS CE的应用工程由于要适当地使用内存,所以都要能接收WM_HIBERNATE 消息。GaX
©南开大学嵌入式系统与信息安全实验室学术论坛 -- 我的论坛,我的天地  X
如果一个应用工程的窗口不可见,该工程不能接收WM_HIBERNATE 消息。之所以收不到该消息,是因为WM_HIBERNATE 消息仅仅被发送到一个在任务栏上有相应菜单的工程。一个隐藏的窗体即使是占用内存很多,也不会接收到该消息。 ,]q

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值