IE工具栏上添加的按钮所响应的事件

wfc2004122 2009-07-24 10:59:54
我看了ray_linn的文章: http://www.javaeye.com/topic/342457 (IE工具栏上添加按钮)
按照方法我加了两个按钮A和B...
1:) 单击后怎么区分单击了哪个按钮 (我想要的效果: 单击A后弹出MessageBox, 单击B后, 弹出下拉菜单)

2:) 怎么实现按钮A和B的右击事件...
...全文
146 点赞 收藏 19
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfc2004122 2009-07-27
思路:添加两个类CA和CB, 分别实现XXX::Exec()
***.rgs里部分代码

HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove 'Internet Explorer'
{
NoRemove Extensions
{
ForceRemove '{8C9C21C7-E5D5-4ea6-8D6C-8FE497E2834A}'
{
val ButtonText = s 'Hello'
val Icon = s 'D:\wsc\test2\Ads.ico'
val CLSID = s '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}'
val ClsidExtension = s '{2F095967-7244-4BAC-9CF0-73502D391677}' (这个是CA对应的GUID)
val 'Default Visible' = s 'yes'
}

ForceRemove '{772F5D87-42F9-43fd-B64A-9E15C5DA7A5F}'
{
val ButtonText = s 'World'
val Icon = s 'D:\wsc\test2\General.ico'
val CLSID = s '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}'
val ClsidExtension = s '{7DC38DC9-FFFC-490E-837F-545094223E5F}' (这个是CB对应的GUID)
val 'Default Visible' = s 'yes'
}
}
}
}
}
}

这样实现添加按钮的单击事件...
回复
wfc2004122 2009-07-27
ok...呵呵...单击实现...不愧天狼星...
先结贴...再发我的代码思路...再发贴(关于右键的...看看还有没有别的思路...)
回复
ahao 2009-07-27
没有主要代码。你怎么加第一个按钮的?再重复一遍加第二个啊。

右击估计实现不了,不是会弹出ie的默认菜单吗?
如果你一定要处理右键,就hook鼠标消息。
回复
wfc2004122 2009-07-27
还有就是右击事件能实现吗..?
回复
wfc2004122 2009-07-27
能否贴出主要代码...?
回复
ahao 2009-07-27
你必须加两个类,然后才会有两个不同的GUID
val ClsidExtension = s '{B62F9ED3-FE9F-486E-89D1-C26FEB3C237F}'

我试过了,可以
回复
wfc2004122 2009-07-27
帖上主要代码
***.rgs里注册按钮

HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove 'Internet Explorer'
{
NoRemove Extensions
{
ForceRemove '{B2D3F85C-C35C-4ca8-8BC7-CFEE63D6217A}'
{
val ButtonText = s 'A'
val Icon = s 'D:\wsc\test\Filter\Gladder.ico'
val CLSID = s '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}'
val ClsidExtension = s '{B62F9ED3-FE9F-486E-89D1-C26FEB3C237F}'
val 'Default Visible' = s 'yes'
}

ForceRemove '{A0688E82-C7F9-44fc-89A3-7C93D58C30AB}'
{
val ButtonText = s 'B'
val Icon = s 'D:\wsc\test\Filter\Ads.ico'
val CLSID = s '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}'
val ClsidExtension = s '{B62F9ED3-FE9F-486E-89D1-C26FEB3C237F}'
val 'Default Visible' = s 'yes'
}


}
}
}
}
}


***.cpp中的 XXX::Exec()

HRESULT hr = S_OK;

if (pguidCmdGroup == NULL)
{
switch (nCmdID)
{
case 0:
{
MessageBox(NULL,_T("one button"),_T("IE Button"),MB_OK); // 不论单击A或B按钮, 都会执行此句
break;
}
default:
{
MessageBox(NULL,_T("other"),_T("IE Button"),MB_OK);
hr = OLECMDERR_E_NOTSUPPORTED;
break;

}
}
}
else
{
hr = OLECMDERR_E_UNKNOWNGROUP;
}

return hr;



另附MSDN Adding Toolbar Buttons 的部分

COM Objects
In order to invoke a Component Object Model (COM) object from Internet Explorer, it must implement IOleCommandTarget. Only one command is supported per object; the COM object's IOleCommandTarget::Exec is always called with nCmdID=0 and with VARIANT arguments set to NULL. Additionally, the implementation of IOleCommandTarget::QueryStatus is always called with cCmds=1.

If the COM object needs to access the browser or Dynamic HTML (DHTML) Object Model of the active page, it must implement IObjectWithSite. Internet Explorer calls IObjectWithSite::SetSite with a pointer to IShellBrowser.

回复
ahao 2009-07-27
你怎么加一个按钮的,就怎么加另一个按钮,两个按钮之间没有关系,有各自的注册表项不就行了?
回复
wfc2004122 2009-07-27
[Quote=引用 10 楼 ahao 的回复:]
取按钮上的文字可以区分,虽然不是很好的方法
或者干脆就用两个类啊
[/Quote]
是不是我理解能力不够...呵呵...
在一个BHO中...怎么做...
回复
ahao 2009-07-27
取按钮上的文字可以区分,虽然不是很好的方法
或者干脆就用两个类啊
回复
wfc2004122 2009-07-27
望赐教...
回复
wfc2004122 2009-07-25
[Quote=引用 7 楼 ahao 的回复:]
Exec函数不是有个GUID参数吗?应该是你那个按钮的GUID吧
[/Quote]
我取出时为NULL...
回复
ahao 2009-07-25
Exec函数不是有个GUID参数吗?应该是你那个按钮的GUID吧
回复
hhwei1985 2009-07-25
帮顶
回复
wfc2004122 2009-07-25
no one...?
回复
wfc2004122 2009-07-24
?
回复
jyh_baoding 2009-07-24
有专业的讨论这问题的帖子,你查查
回复
wfc2004122 2009-07-24
to oyljerry:
多谢你的回复...
他分析的ID是点击B后下拉出菜单里的子ID...而我想要分析A和B这两个按钮的ID...
回复
oyljerry 2009-07-24
1.代码例子中给出了,分析不同的ID

# switch (nCommand)
# {
# case ID_CHIMP:
# {
# MessageBox(hWndParent,_T("Play Video"),_T("IEVideo --Ray"), MB_OK|MB_ICONEXCLAMATION);
# }
# break;
# case ID_SELECT:
# {
# MessageBox(hWndParent,_T("Select Video"),_T("IEVideo --Ray"), MB_OK|MB_ICONEXCLAMATION);
#
# }
# break;
# case ID_STOP:
# {
# MessageBox(hWndParent,_T("Stop Video"),_T("IEVideo --Ray"), MB_OK|MB_ICONEXCLAMATION);
# }
# break;
# case ID_ABOUT:
# {
# MessageBox(hWndParent,_T("About IEVideo"),_T("IEVideo --Ray"), MB_OK|MB_ICONEXCLAMATION);
# }
# break;
# }

回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告