【LibUIDK界面库系列文章】得到菜单的菜单窗口句柄

作者:刘树伟


当我们超类化,或者使用Hook来修改菜单的时候,是和菜单的窗口句柄HWND打交道,但这时候,很难得到菜单的句柄HMENU。MFC也没有提供菜单窗口句柄HWND与菜单句柄HMENU的转换函数。
但通过分析CMenu::TrackPopupMenu的源代码,我们发现,虽然没办法直接互转HWND与HMENU,但由于TrackPopupMenu是同步阻塞模式,所以我们可以通过AfxGetThreadState,来完成这一角色互换。
BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect)
{
 ASSERT(m_hMenu != NULL);

 _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
 HWND hWndOld = pThreadState->m_hTrackingWindow;
 HMENU hMenuOld = pThreadState->m_hTrackingMenu;
 pThreadState->m_hTrackingWindow = pWnd->GetSafeHwnd();
 pThreadState->m_hTrackingMenu = m_hMenu;

 BOOL bOK = ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, pThreadState->m_hTrackingWindow, lpRect);

 pThreadState->m_hTrackingWindow = hWndOld;
 pThreadState->m_hTrackingMenu = hMenuOld;

 return bOK;
}

当超类化或使用Hook修改菜单的时候,在菜单窗口处理函数中处理HWND时,或者在处理WM_INITMENUPOPUP消息时。我们就可以通过AfxGetThreadState得到的_AFX_THREAD_STATE指针,来实现HWND与HMENU的互转。
pThreadState->m_hTrackingWindow:menu的宿主窗口
pThreadState->m_hTrackingMenu:menu句柄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值