C++ 为什么这段代码在运行?

C++ 为什么这段代码在运行?,c++,c,wndproc,C++,C,Wndproc,我写了以下WndProc。它由通知图标使用。我删除了不重要的部分(如默认标签),以获得更好的概述 当我用鼠标右键单击Nofify图标时,关联菜单出现。当我点击一个项目时,我会得到相应的TrackPopupMenu返回值并打印出来。但是,TrackPopupMenu是一个阻塞调用,但是WndProc在上下文菜单打开时工作正常。为什么? LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

我写了以下WndProc。它由通知图标使用。我删除了不重要的部分(如默认标签),以获得更好的概述

当我用鼠标右键单击Nofify图标时,关联菜单出现。当我点击一个项目时,我会得到相应的TrackPopupMenu返回值并打印出来。但是,TrackPopupMenu是一个阻塞调用,但是WndProc在上下文菜单打开时工作正常。为什么?

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        hMenu = CreatePopupMenu();
        AppendMenu(hMenu, MF_STRING, ID_TRAY_EXIT_CONTEXT_MENU_ITEM, displayString);
    }
         break;
    case WM_TRAYICON:
        switch (lParam)
        {
        case WM_RBUTTONUP:
        {
            POINT curPoint;
            GetCursorPos(&curPoint);
            UINT clicked = TrackPopupMenu(
                hMenu,
                TPM_RETURNCMD | TPM_NONOTIFY,
                curPoint.x,
                curPoint.y,
                0,
                hWnd,
                NULL
                );

            std::cout << std::to_string(clicked) << std::endl;
        }
            break;
        }
        std::cout << lParam << std::endl;
        break;
    }
    return 0;
}
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_创建:
{
Humenu=CreatePopupMenu();
附加菜单(菜单、MF字符串、ID托盘、退出上下文菜单项、显示字符串);
}
打破
案例WM_TRAYICON:
交换机(LPRAM)
{
案例WM_RBUTTONUP:
{
凝乳点;
GetCursorPos(&curPoint);
UINT clicked=轨迹弹出菜单(
汉努,
TPM_RETURNCMD | TPM_Notify,
凝乳点,
宵禁。你,
0,
hWnd,
无效的
);

std::cout是因为
TrackPopupMenu
在执行时正在泵送消息。也就是说,它有一个消息处理循环,对发布到线程消息队列中的任何新消息调用
DispatchMessage
,然后用每个窗口的消息调用窗口过程。