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