如何獲取鼠標指針下的菜單句柄?(我認為是高難度--就象獲取鼠標器下的窗口句柄一樣(WindowFromPoint))

无敌魔仙 2003-02-14 08:27:14
比如當Word2000的文件菜單被彈出來后,可否根据鼠標器的位置,獲取不同的菜單選項的句柄,譬如當鼠標器在 "打開" 上是我就獲取 "打開" 菜單選項的句柄,而在 "關閉" 上時就獲取 "關閉" 選項的句柄,就象獲取鼠標器下的窗口句柄一樣(WindowFromPoint)
...全文
52 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
toolscreator 2003-02-15
  • 打赏
  • 举报
回复
跨进程使用,有些API操作是不会有结果的.发消息也是.
yins 2003-02-15
  • 打赏
  • 举报
回复
GetMenu(,会不会要主窗口的HANDLE才行?
leehq 2003-02-15
  • 打赏
  • 举报
回复
如果你这些代码是在菜单弹出后还是弹出前执行的?
无敌魔仙 2003-02-15
  • 打赏
  • 举报
回复
了找到光標所在點的菜單選項的句柄,我用了如下代碼:

開始找到光標所在點的窗口,並列出其菜單資源.
HINSTANCE hInstMain;
HWND hTopHwnd;
BOOL bHaveFoundMainHwnd=FALSE;
while(!bHaveFoundMainHwnd)
{
if(GetParent(hwndUnderCursor)!=NULL)
{
hwndUnderCursor=GetParent(hwndUnderCursor);
hTopHwnd=GetParent(hwndUnderCursor);
}
else
{
bHaveFoundMainHwnd=TRUE;
}
}

if(hTopHwnd==NULL)
hTopHwnd=hwndUnderCursor;

hInstMain = (HINSTANCE) GetWindowLong (hTopHwnd, GWL_HINSTANCE);
if(hInstMain)
{
EnumResourceNames(hInstMain,RT_MENU,(ENUMRESNAMEPROC)EnumMenuNameProc,0);
}


列出菜單資源的回調函數
BOOL CALLBACK EnumMenuNameProc(HINSTANCE hModule,LPCTSTR lpszType,LPTSTR lpszName,LONG lParam)
{
HMENU hMenu;
HRSRC hHrsc;
hHrsc=FindResource(hModule,lpszName,RT_MENU);
hMenu=(HMENU)LoadResource(hModule,hHrsc);
if(hMenu!=NULL)
{
UINT iMenuItem=0;
POINT ptCursor;
HWND hwndUnderCursor;

GetCursorPos(&ptCursor);
hwndUnderCursor=WindowFromPoint(ptCursor);

HWND hTopHwnd;
BOOL bHaveFoundMainHwnd=FALSE;
while(!bHaveFoundMainHwnd)
{
if(GetParent(hwndUnderCursor)!=NULL)
{
hwndUnderCursor=GetParent(hwndUnderCursor);
hTopHwnd=GetParent(hwndUnderCursor);
}
else
{
bHaveFoundMainHwnd=TRUE;
}
}

if(hTopHwnd==NULL)
hTopHwnd=hwndUnderCursor;

iMenuItem=MenuItemFromPoint(hTopHwnd,hMenu,ptCursor);

if(iMenuItem!=-1)
{
MessageBox(NULL,"OK","OK",MB_OK);
}
}

return TRUE;
}

但是我發現結果卻是任何東西都沒有返回,iMenuItem為-1,為何
leehq 2003-02-15
  • 打赏
  • 举报
回复
GetCursorPos获得的是屏幕坐标!
htnz 2003-02-15
  • 打赏
  • 举报
回复
GetCursorPos(&ptCursor);好象是相对位置;
HDC * DC=::GETDC();
mengxianbao1521 2003-02-14
  • 打赏
  • 举报
回复
self
leehq 2003-02-14
  • 打赏
  • 举报
回复
用MenuItemFromPoint函数!
当然你必须在菜单弹出后捕捉鼠标事件,推荐使用hook技术!
无敌魔仙 2003-02-14
  • 打赏
  • 举报
回复
我用如下代碼:
POINT ptCursor;
HWND hwndUnderCursor;
HMENU hMenu;
UINT iMenuItem;

GetCursorPos(&ptCursor);
hwndUnderCursor=WindowFromPoint(ptCursor);
hMenu=GetMenu(hwndUnderCursor);
iMenuItem=MenuItemFromPoint(hwndUnderCursor,hMenu,ptCursor);
最后發現是在GetMenu時出了問題,明明對象窗口有menu,我卻得不到菜單句柄,為何呢?

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧