分享免费的编程资源和教程

网站首页 > 技术教程 正文

C++消息循环GetMessage/TranslateMessage/DispatchMessage

goqiw 2024-10-25 13:06:16 技术教程 29 ℃ 0 评论

1.Windows C++消息循环处理

while (GetMessage(&msg, NULL, 0, 0)) {
   TranslateMessage(&msg); //消息转化
   DispatchMessage(&msg);  //消息派遣.  把TranslateMessage转换的消息
                                              //发送到窗口的消息处理函数,此函数在窗口注册时已经指定
  }

消息循环执行过程:

  1. 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(这时程序会阻塞)。
  2. 如果有事件发生时导致有一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。
  3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步
  4. DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。
  5. 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。
  6. 一旦一个消息处理完成,窗口过程函数返回,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指向的函数,而不是调用窗口程序。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表