首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

在 Microsoft Word 中整合 Microsoft Agent:利用鉤子與 COM 打造專屬辦公助手

     編輯:關於VC++

動機:讓 Word 助手不再單調

每天面對 Word 內建的幾個 Office Assistant(如回形針 Clippy),久而久之難免感到乏味。Microsoft Agent 技術提供了豐富的動畫角色(如 Merlin、Genie、Robby 等),並支援語音輸出、氣球提示等互動方式。本文示範如何透過全域鉤子攔截 Word 視窗訊息,並結合 COM 技術在 Word 中嵌入 MSAgent 角色,實現自訂的功能提示與互動。

核心架構:DLL 注入 + 全域鉤子 + COM 元件

  1. 建立 DLL:包含共享資料區段(#pragma data_seg(".SHARED")),儲存被監視程序(Word)的視窗控制代碼 gs_hClient、伺服器視窗控制代碼 gs_hServer、DLL 實例句柄 g_hInst 及鉤子句柄 g_hHook。
  2. 安裝鉤子:呼叫 SetWindowsHookEx(WH_CALLWNDPROC, MsgHookProc, g_hInst, threadId),針對 Word 所在執行緒安裝「呼叫視窗程序」鉤子。
  3. 訊息處理:鉤子回呼 MsgHookProc 接收 CWPSTRUCT*(指向 MSG 結構),篩選感興趣的訊息(如 WM_DESTROY),轉發給伺服器視窗處理。
  4. MSAgent 初始化與互動:在伺服器端初始化 COM (CoInitialize),建立 IAgent、IAgentCharacter 介面,載入角色檔(.acs),播放動畫、顯示氣球提示。

關鍵程式碼片段

共享資料區段與鉤子安裝

#pragma data_seg(".SHARED")
HWND gs_hClient = NULL;   // 被監視程序視窗 (Word)
HWND gs_hServer = NULL;   // 處理訊息的伺服器視窗
HINSTANCE g_hInst;
HHOOK g_hHook;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SHARED,RWS")

// 安裝鉤子
g_hHook = ::SetWindowsHookEx(
    WH_CALLWNDPROC,
    (HOOKPROC)MsgHookProc,
    g_hInst,
    ::GetWindowThreadProcessId(gs_hClient, NULL)
);

鉤子回呼:攔截 WM_DESTROY 示例

LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode >= 0) {
        LPMSG pMsg = (LPMSG)lParam;
        if (pMsg->message == WM_DESTROY) {
            // 轉發給伺服器視窗,觸發 MSAgent 反應
            ::SendMessage(gs_hServer, pMsg->message, pMsg->wParam, pMsg->lParam);
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

MSAgent COM 初始化流程

// 伺服器視窗訊息處理中
CoInitialize(NULL);
IAgent* pAgent;
CoCreateInstance(CLSID_Agent, NULL, CLSCTX_INPROC_SERVER,
                 IID_IAgent, (void**)&pAgent);
pAgent->Load(...);           // 載入角色
IAgentCharacter* pChar;
pAgent->GetCharacter(...);   // 取得角色介面
pChar->Show(...);            // 顯示角色
pChar->Speak(...);           // 說話/顯示氣球
// ... 互動邏輯 ...
pChar->Release();
pAgent->Release();
CoUninitialize();

開發工具與除錯技巧

  • Spy++:不可或缺的利器,用於擷取 Word 視窗的訊息流,確認目標訊息(如 WM_COMMAND、WM_NOTIFY、選單選取等)。
  • VC++ 6.0:本範例開發環境,亦適用於更新版 Visual Studio(需注意字元集與 Unicode 設定)。
  • 執行順序:必須先啟動 Word,再執行安裝鉤子的 EXE,確保 gs_hClient 有效。

擴充應用建議

  • 攔截選單命令 (WM_COMMAND),在使用者點選「儲存」時由 Agent 提醒「別忘了備份!」
  • 監視游標位置,在特定區域顯示操作提示。
  • 結合語音辨識 (SAPI),實現語音控制 Word。

注意事項

  • 全域鉤子會影響系統效能,盡量縮短回呼執行時間,避免在鉤子中進行耗時操作。
  • MSAgent 於 Windows 7 後不再內建,需額外安裝;現代應用可考慮改用 WPF/WinUI 自訂動畫角色或 WebView2 嵌入網頁互動助手。
  • 本範例為技術演示,生產環境需加強錯誤處理、版本相容性測試與安全性審查。
本文配套源碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved