这里说的方法适合任何IE toolbar,已经测试的包括:
- google toolbar
- MSN toolbar
- Sina DDT
- Yahoo toolbar
(0) 如果你还不了解下面几个接口的作用,请查询MSDN。
- IServiceProvide
- IInputObjectSite
- IOleWindow
- IWebBrowser2
- IDeskBand
- IObjectWithSite
- IInputObject
(1) google toolbar的classid为{2318C2B1-4965-11d4-9B18-009027A5CD4F},通过CoCreateInstance将其装入内存。
(2) 实现IUnknown接口,在其QueryInterface接口中,如果发现要查询的IID为IInputObjectSite时,调用自身实现的该对象,见(3)。
(3) 实现IInputObjectSite、IOleWindow、IServiceProvider接口。
- IServiceProvider接口的QueryService方法中,传入自身浏览器的IWebBrowser2。
- IInputObjectSite的OnFocusChangeIS,返回S_OK。
- IOleWindow的GetWindow,返回父窗口句柄。
- IOleWindow的ContextSensitiveHelp,返回S_OK。
(4) 得到gtb的IObjectWithSite接口,调用其SetSite方法,将自己的IUnknown接口传递给它。
(5) 此时gtb已经被创建,但是还处于隐藏状态。得到其IDeskBand接口,通过GetWindows方法得到它的窗口句柄。如果需要的话,使用::SetParent函数改变其父窗口。可以用::ShowWindow函数将它显示出来,之后调用ShowDW方法和IInputObject::HasFocusIO方法重设其内部的显示状态。
(6) 父窗口改变大小的时候,需要用IDeskBand::ResizeBorderDW通知gtb窗口大小已经改变,还必须用MoveWindow或者SetWindowPos真正改变其大小。