IE 工具列是運行在 IE 進程內的 COM 物件(In-proc Server),由 IE 被動載入並透過特定介面互動。本文記錄從建立 ATL 專案到實作 IObjectWithSite、IDeskBand、IInputObject 三大介面,並完成註冊的完整流程。
MyBand.dll(便於識別)。| 介面 | 繼承鏈 | 關鍵方法 | 用途 |
|---|---|---|---|
IObjectWithSite | - | SetSite(IUnknown*), GetSite | IE 載入/卸載工具列時呼叫,傳遞 IWebBrowser2 指標 |
IOleWindow | - | GetWindow, ContextSensitiveHelp | 提供工具列視窗控制碼 |
IDockingWindow | IOleWindow | ShowDW, CloseDW, ResizeBorderDW | 停靠視窗顯示/隱藏/調整邊框 |
IDeskBand | IDockingWindow | GetBandInfo | 回報工具列尺寸、標題、模式(如 DBIMF_VARIABLEHEIGHT) |
IInputObject | - | UIActivateIO, HasFocusIO, TranslateAcceleratorIO | 焦點管理與快捷鍵轉譯 |
// IObjectWithSite::SetSite
STDMETHODIMP CMyBand::SetSite(IUnknown* pUnkSite) {
if (m_spSite) m_spSite->Release();
m_spSite = pUnkSite;
if (m_spSite) m_spSite->AddRef();
// 建立工具列子視窗(建議先建一個子視窗再作為父視窗)
if (pUnkSite && !m_hWndToolbar) {
m_hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | CCS_NOPARENTALIGN | CCS_NODIVIDER,
0,0,0,0, NULL, NULL, _Module.GetModuleInstance(), NULL);
// 初始化按鈕、編輯框、下拉框等控制項...
}
return S_OK;
}
// IDeskBand::GetBandInfo
STDMETHODIMP CMyBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) {
if (pdbi->dwMask & DBIM_MINSIZE) pdbi->ptMinSize = { 100, 22 };
if (pdbi->dwMask & DBIM_MAXSIZE) pdbi->ptMaxSize = { -1, 22 };
if (pdbi->dwMask & DBIM_INTEGRAL) pdbi->ptIntegral = { 1, 1 };
if (pdbi->dwMask & DBIM_ACTUAL) pdbi->ptActual = { 200, 22 };
if (pdbi->dwMask & DBIM_TITLE) lstrcpy(pdbi->wszTitle, L"My Toolbar");
if (pdbi->dwMask & DBIM_MODEFLAGS) pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
if (pdbi->dwMask & DBIM_BKCOLOR) pdbi->crBkgnd = GetSysColor(COLOR_3DFACE);
return S_OK;
}
SetSite 中建立工具列視窗(CreateWindowEx),樣式含 WS_CHILD。IOleWindow::GetWindow 回傳此工具列 HWND。MyBand.dll。regsvr32 MyBand.dll(或專案內建「註冊」目標)。
HKCR\CLSID\{YOUR_GUID} // 元件 CLSID
InprocServer32 = "MyBand.dll"
ThreadingModel = "Apartment"
HKCR\CLSID\{YOUR_GUID}\Implemented Categories\{00021492-0000-0000-C000-000000000046} // CATID_DeskBand
HKLM\Software\Microsoft\Internet Explorer\Toolbar\{YOUR_GUID} // 可選:預設顯示
regsvr32 是否成功、CATID_DeskBand 分類是否註冊。C:\Program Files\Internet Explorer\iexplore.exe,設定斷點即可進入 SetSite 等入口。Common Controls 6.0 並處理 WM_THEMECHANGED。TB_SETBUTTONSIZE + TB_REPLACEBITMAP 實現自定義。IInputObject::TranslateAcceleratorIO 轉發 WM_KEYDOWN。IE 工具列開發核心在於正確實作 IObjectWithSite(生命週期)、IDeskBand(幾何屬性)、IInputObject(輸入焦點)三介面,並完成 DeskBand 分類註冊。本文提供的最小化實作可作為進一步功能擴展(搜尋框、下載管理、即時資訊等)的起點。