CppWebBrowser (封裝 WebBrowser ActiveX) 預設不處理 Enter、Backspace、Left/Right 等鍵盤訊息,導致網頁輸入框、編輯器無法正常操作。即使呼叫 OleInitialize(NULL) 也無效。
TApplicationEvents 元件。IOleInPlaceActiveObject *FOleInPlaceActiveObject = NULL;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。IsDialogMessage 先處理對話框鍵盤導航 (Tab/Enter/方向鍵),再由 TranslateAccelerator 處理 WebBrowser 內部快捷鍵。此法源自 Delphi 社群移植,經測試在 BCB6/2007 有效解決按鍵無反應問題。