码迷,mamicode.com
首页 > 编程语言 > 详细

BHO多线程中实现右键菜单

时间:2015-04-11 01:19:41      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

在BHO中实现右键菜单网上相关文章很多,可以通过实现IDocHostUIHandler接口的ShowContextMenu、截获HTMLDocumentEvents2的OnContextMenu消息等。

但这两种方式都必须在浏览器线程中实现才能正常弹出右键菜单,当你需要在另外的线程中实现右键菜单,这就不行了,TrackPopupMenuEx的时候会直接略过。

我采取的方式是建一个看不见的窗口,TrackPopupMenuEx所需的窗口句柄设置为该窗口。

构建一个轻量级的窗体类:

#include <atlbase.h>
#include <atlwin.h>

class CMenuWindow : public ATL::CWindowImpl < CMenuWindow >
{
public:
	BEGIN_MSG_MAP(CMenuWindow)
	END_MSG_MAP();
};

  

右键菜单例子:

HMENU hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, 1001, L"aaa");
AppendMenu(hMenu, MF_STRING, 1002, L"bbb");
AppendMenu(hMenu, MF_STRING, 1003, L"ccc");
POINT pt;
GetCursorPos(&pt);
RECT wndRect;
wndRect.left = pt.x;
wndRect.top = pt.y;
wndRect.right = wndRect.left + 1;
wndRect.bottom = wndRect.top + 1;
CMenuWindow wnd;
wnd.Create(NULL, wndRect, _T(""), WS_OVERLAPPED | WS_CAPTION);
int cmd = TrackPopupMenuEx(hMenu, TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RETURNCMD | TPM_LEFTBUTTON, pt.x, pt.y, wnd.m_hWnd, NULL);
DestroyMenu(hMenu);
wnd.DestroyWindow();

ATL::CString msg;
msg.Format(L"id = %d", cmd);
MessageBox(NULL, msg, L"", MB_OK);

  

BHO多线程中实现右键菜单

标签:

原文地址:http://www.cnblogs.com/icedream/p/4416037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!