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

C++ Builder 讓 CppWebBrowser 響應 Enter 鍵

     編輯:關於C++

透過 IOleInPlaceActiveObject::TranslateAccelerator 轉發按鍵訊息

CppWebBrowser (內嵌 IE ActiveX) 預設不處理對話框按鍵 (如 Enter、Backspace、方向鍵)。需在 TApplicationEvents.OnMessage 中攔截訊息,取得 ActiveX 的 IOleInPlaceActiveObject 介面並呼叫 TranslateAccelerator。

宣告私有介面指標

private:
    IOleInPlaceActiveObject *FOleInPlaceActiveObject;

ApplicationEvents OnMessage 處理

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

    Handled = IsDialogMessage(CppWebBrowser->Handle, &Msg);
    if (Handled && !CppWebBrowser->Busy) {
        if (FOleInPlaceActiveObject == NULL) {
            IDispatch *Dispatch = CppWebBrowser->Application;
            if (Dispatch) {
                IOleInPlaceActiveObject *iOIPAO;
                if (SUCCEEDED(Dispatch->QueryInterface(IID_IOleInPlaceActiveObject,
                    (void**)&iOIPAO)))
                    FOleInPlaceActiveObject = iOIPAO;
            }
        }
        if (FOleInPlaceActiveObject) {
            // 避免轉發某些按鍵造成重複處理
            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);
            }
        }
    }
}

注意事項

  • 需包含 #include <ocidl.h> 等 ActiveX 標頭檔。
  • 若表單包含其他第三方套件 (如 SuiPack) 可能干擾此機制,作者表示仍在研究中。
  • IsDialogMessage 先處理標準對話框鍵盤導航,再轉發給 ActiveX。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved