当单击TrackPopupMenu产生的菜单时产生什么消息?

时间:2023-01-15 15:31:16
1.当单击TrackPopupMenu产生的菜单时产生什么消息?
2.怎样在菜单失去焦点时使菜单消失?比如用户单击菜单之外的其他窗口时?

13 个解决方案

#1


1 发送包含该菜单项的 WM_COMMAND 消息,你可以象响应普通菜单一样响应该项的 COMMAND
2 如果我没记错的话,TrackPopupMenu 出来的菜单当失去焦点会自动消失

#2


1。是这样吗ON_COMMAND(IDR_MENU1,OnIdrMenu1)?不成啊,根本不能触发啊

2。不会自动消失,这点我可以确定。我曾经看过一篇文章的介绍,不过太久了,忘了怎么说的了。

#3


1.肯定是可以的,但是你必须把 TrackPopupMenu里的hWnd参数设置为你处理ON_COMMAND消息的这个window,MFC的话一般是FrameWindow,其实随便指定哪个窗口都行,但必须是在这个hWnd里处理这个ON_COMMAND消息
2.有一段Remarks可以参考一下,但是是针对右下角的任务栏上的小图标的,其他窗口都能自动消失的
Remarks
To display a context menu for a notification icon, the current window must be the foreground window before the application calls TrackPopupMenu or TrackPopupMenuEx. Otherwise, the menu will not disappear when the user clicks outside of the menu or the window that created the menu (if it is visible). 

#4


1。没问题啊,我的程序只有一个对话框(MFC),我把HWND设置成了对话框的hwnd,但是还是不行啊。

2。这个remark也不能解决问题啊,我的程序只有在最小化的时候才有小图标,肯定不会自动消失

#5


把你的 TrackPopupMenu 的代码贴出来看看

#6


LRESULT CMyDlg::MyNotify(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg; 

uMouseMsg=(UINT)lParam;

switch(uMouseMsg)
{
case WM_RBUTTONUP:
{
POINT p;
char item[]="显示";
GetCursorPos(&p);
if(IsWindowVisible())
strcpy(item,"隐藏");
ModifyMenu(m_hMenu,1,MF_BYCOMMAND|MF_STRING,ID_TCPQQ_133,item);
TrackPopupMenu(m_hMenu,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON,p.x,p.y,0,m_hWnd,0);
break;
}
default:
break;
}
return 1;
}

#7


上面那个有点乱,重贴一个

LRESULT CMyDlg::MyNotify(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg; 

uMouseMsg=(UINT)lParam;

switch(uMouseMsg)
{
case WM_RBUTTONUP:
{
POINT p;
GetCursorPos(&p);
TrackPopupMenu(m_hMenu,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON,p.x,p.y,0,m_hWnd,0);
break;
}
default:
break;
}
return 1;
}

#8


你指定了TPM_RETURNCMD, 所以在调用TrackPopupMenu之后直接返回了被选中的Menu Item ID, 而不会发送消息到m_hWnd, 所以你需要去掉TPM_RETURNCMD或者直接在这里处理相应的command.
另外,你是在WM_RBUTTONUP里弹出快捷菜单的,不建议这样做,不如直接处理WM_CONTEXTMENU,一个明显的优点是这样键盘上的Windows快捷键才能起作用

#9


好的,多谢了!

#10


对了,怎么能让那个菜单消失啊?

#11


我加上了WM_CONTEXTMENU,但是我在任务栏右击鼠标的时候不管用

#12


kingtsui(老农民) 
你果然是高手
在下佩服!!!!
谢谢!

#13


我也遇到类似的问题,在菜单被激活的情况下,在程序中无法关闭它,不像是窗口那样可以随时关,但我无法解决,折中的办法是自己写菜单:(

#1


1 发送包含该菜单项的 WM_COMMAND 消息,你可以象响应普通菜单一样响应该项的 COMMAND
2 如果我没记错的话,TrackPopupMenu 出来的菜单当失去焦点会自动消失

#2


1。是这样吗ON_COMMAND(IDR_MENU1,OnIdrMenu1)?不成啊,根本不能触发啊

2。不会自动消失,这点我可以确定。我曾经看过一篇文章的介绍,不过太久了,忘了怎么说的了。

#3


1.肯定是可以的,但是你必须把 TrackPopupMenu里的hWnd参数设置为你处理ON_COMMAND消息的这个window,MFC的话一般是FrameWindow,其实随便指定哪个窗口都行,但必须是在这个hWnd里处理这个ON_COMMAND消息
2.有一段Remarks可以参考一下,但是是针对右下角的任务栏上的小图标的,其他窗口都能自动消失的
Remarks
To display a context menu for a notification icon, the current window must be the foreground window before the application calls TrackPopupMenu or TrackPopupMenuEx. Otherwise, the menu will not disappear when the user clicks outside of the menu or the window that created the menu (if it is visible). 

#4


1。没问题啊,我的程序只有一个对话框(MFC),我把HWND设置成了对话框的hwnd,但是还是不行啊。

2。这个remark也不能解决问题啊,我的程序只有在最小化的时候才有小图标,肯定不会自动消失

#5


把你的 TrackPopupMenu 的代码贴出来看看

#6


LRESULT CMyDlg::MyNotify(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg; 

uMouseMsg=(UINT)lParam;

switch(uMouseMsg)
{
case WM_RBUTTONUP:
{
POINT p;
char item[]="显示";
GetCursorPos(&p);
if(IsWindowVisible())
strcpy(item,"隐藏");
ModifyMenu(m_hMenu,1,MF_BYCOMMAND|MF_STRING,ID_TCPQQ_133,item);
TrackPopupMenu(m_hMenu,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON,p.x,p.y,0,m_hWnd,0);
break;
}
default:
break;
}
return 1;
}

#7


上面那个有点乱,重贴一个

LRESULT CMyDlg::MyNotify(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg; 

uMouseMsg=(UINT)lParam;

switch(uMouseMsg)
{
case WM_RBUTTONUP:
{
POINT p;
GetCursorPos(&p);
TrackPopupMenu(m_hMenu,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON,p.x,p.y,0,m_hWnd,0);
break;
}
default:
break;
}
return 1;
}

#8


你指定了TPM_RETURNCMD, 所以在调用TrackPopupMenu之后直接返回了被选中的Menu Item ID, 而不会发送消息到m_hWnd, 所以你需要去掉TPM_RETURNCMD或者直接在这里处理相应的command.
另外,你是在WM_RBUTTONUP里弹出快捷菜单的,不建议这样做,不如直接处理WM_CONTEXTMENU,一个明显的优点是这样键盘上的Windows快捷键才能起作用

#9


好的,多谢了!

#10


对了,怎么能让那个菜单消失啊?

#11


我加上了WM_CONTEXTMENU,但是我在任务栏右击鼠标的时候不管用

#12


kingtsui(老农民) 
你果然是高手
在下佩服!!!!
谢谢!

#13


我也遇到类似的问题,在菜单被激活的情况下,在程序中无法关闭它,不像是窗口那样可以随时关,但我无法解决,折中的办法是自己写菜单:(