c++ - 为什么这段代码会运行?

标签 c++ c wndproc

我编写了以下 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;
}

最佳答案

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

关于c++ - 为什么这段代码会运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406035/

相关文章:

c++ - GCC 和 Clang 代码性能的巨大差异

c++ - 如何在函数内部操作 char 数组(字符串)的指针,它在 c/c++ 中作为参数传递

c++ - 获取尺寸较小的矩阵的子矩阵

c - 这个程序使用多少 inode,打开文件表条目和文件描述符

Java JNA WindowProc JVM 崩溃

c# - WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息

c++ - 查找新行字符 C++

python - 如何在 ctypes 中声明带有指向数组指针的 C 结构?

c - 关于 C 中 1 元素数组的类型定义

c# - WPF:应用程序关闭时关闭辅助窗口而无需 "programmer"干预