为什么GetMessage()没有退出?

时间:2018-02-02 20:43:33

标签: c++ winapi

了解WinApi的SendMessageCallback声明调用函数还必须调用GetMessagePeekMessageWaitMessage来调用回调函数。< / p>

我的代码:

#include <Windows.h>
#include <iostream>
using namespace std;

VOID CALLBACK MySendAsyncProc(HWND hwnd, UINT uMsg, ULONG_PTR dwData, LRESULT lResult) {
    cout << "callback" << endl;
}

int main() {
    HWND hwnd = FindWindow(NULL, L"Calculator");
    SendMessageCallback(hwnd, WM_SETCURSOR, (WPARAM) hwnd, MAKELPARAM(1, WM_MOUSEMOVE), MySendAsyncProc, 0);
    MSG msg;
    GetMessage(&msg, nullptr, 0, 0);
    cout << "recieved" << endl;
    return 0;
}

输出;

callback

我期望作为输出;

callback
recieved

可以肯定的是,回调函数被调用,但我如何&#34;退出&#34; GetMessage?回调函数打印并且程序继续运行但它从不打印&#34; revieved&#34; - 我为实现我的期望做了哪些改变?

1 个答案:

答案 0 :(得分:1)

GetMessage等待在线程的消息队列中接收排队的消息(PostMessage)。在此期间,它处理所有未排队的消息(来自SendMessage和朋友),但这些消息不会导致它返回。

由于您的帖子从未发布过任何帖子,GetMessage会一直等待。

在您的特定情况下,PeekMessage是一个不错的选择,因为它在完成处理已发送邮件时会返回。

如果您想要暂停GetMessage操作,MsgWaitForMultipleObjects()会有所帮助。