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

讓 CppWebBrowser 響應 Enter/Backspace/方向鍵 (解決按鍵不傳遞問題)

     編輯:VC 教學

問題現象

CppWebBrowser (封裝 WebBrowser ActiveX) 預設不處理 Enter、Backspace、Left/Right 等鍵盤訊息,導致網頁輸入框、編輯器無法正常操作。即使呼叫 OleInitialize(NULL) 也無效。

解決方案:ApplicationEvents + IOleInPlaceActiveObject

  1. 表單加入 TApplicationEvents 元件。
  2. 宣告私有介面指標:IOleInPlaceActiveObject *FOleInPlaceActiveObject = NULL;
  3. 在 OnMessage 事件中攔截訊息並轉發給 WebBrowser 的 ActiveObject。

完整程式碼

void __fastcall TfmChildwin::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
    if (!CppWebBrowser) { Handled = false; return; }

    Handled = IsDialogMessage(CppWebBrowser->Handle, &Msg);
    if (Handled && !CppWebBrowser->Busy) {
        if (!FOleInPlaceActiveObject) {
            IDispatch *disp = CppWebBrowser->Application;
            if (disp) {
                IDispatch *pDisp = disp; // 避免重複查詢
                disp->QueryInterface(__uuidof(IOleInPlaceActiveObject), (void**)&FOleInPlaceActiveObject);
            }
        }
        if (FOleInPlaceActiveObject) {
            // 讓 Backspace、Left、Right 由系統處理 (IsDialogMessage 已處理)
            if ((Msg.message == WM_KEYDOWN || Msg.message == WM_KEYUP) &&
                (Msg.wParam == VK_BACK || Msg.wParam == VK_LEFT || Msg.wParam == VK_RIGHT)) {
                // 不轉發,讓預設行為生效
            } else {
                FOleInPlaceActiveObject->TranslateAccelerator(&Msg);
            }
        }
    }
}

注意事項

  • 需包含 ocidl.h (定義 IOleInPlaceActiveObject) 並連結 oleaut32.lib。
  • 若表單還使用其他第三方皮膚套件 (如 SuiPack),此法可能失效,需進一步調試訊息鏈。
  • IsDialogMessage 先處理對話框鍵盤導航 (Tab/Enter/方向鍵),再由 TranslateAccelerator 處理 WebBrowser 內部快捷鍵。

此法源自 Delphi 社群移植,經測試在 BCB6/2007 有效解決按鍵無反應問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved