为什么这段代码在运行?

时间:2015-02-09 09:03:00

标签: c++ c wndproc

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

当我用鼠标右键单击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;
}

1 个答案:

答案 0 :(得分:3)

因为TrackPopupMenu正在执行消息。也就是说,它有一个消息处理循环,它为发布到线程消息队列的任何新消息调用DispatchMessage,而DispatchMessage依次使用每个窗口的消息调用您的窗口过程。