2015-02-09 130 views
1

我写了下面的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; 
} 

回答

3

因为TrackPopupMenu在执行时正在泵送消息。也就是说,它有一个消息处理循环,用于调用DispatchMessage以发布到线程的消息队列中的任何新消息,而DispatchMessage又调用您的窗口过程,并为每个窗口指定消息。