CppWebBrowser (內嵌 IE ActiveX) 預設不處理對話框按鍵 (如 Enter、Backspace、方向鍵)。需在 TApplicationEvents.OnMessage 中攔截訊息,取得 ActiveX 的 IOleInPlaceActiveObject 介面並呼叫 TranslateAccelerator。
private:
IOleInPlaceActiveObject *FOleInPlaceActiveObject;
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 標頭檔。IsDialogMessage 先處理標準對話框鍵盤導航,再轉發給 ActiveX。