いつもお世話になっております。
昨日も別の質問をさせていただいたばかりですが,別口でもう1件お願いいたします。
WebBrowserでは,ショートカットキーやエンターキーが利かないという,有名なバグ
があるとのことでしたが,過去ログ等を参考に,下のようなコードを書き,
ショートカットキーやエンターキーが利くように修正をしてみました。
ですが,このコードを書くと,本来はIEのようにBackSpaceキーで前のページ「戻る」
ことができるはずが,BackSpaceキーが無効になってしまい,戻れなくなってしまい
ました。
↓参照したページ
https://www.petitmonte.com/bbs/answers?question_id=973
この利かなくなったBackSpaceキーを再び有効にするには,どうすればよいでしょうか。
もう2か月以上悩んでいます。ぜひご回答をよろしくお願いいたします。
(環境:WinXP SP2 + Delphi 6 Personal)
var
FOleInPlaceActiveObject: IOleInPlaceActiveObject;
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
function ProcessKeyForBrowser(const Msg: TMsg): Boolean;
var
Key: TWMKey;
begin
Key.Msg := Msg.message;
Key.CharCode := msg.wParam;
Key.KeyData := msg.lParam;
Key.Result := 0;
Result := Self.IsShortCut(Key);
end;
var
iOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
begin
if WebBrowser1 = nil then exit;
if (Msg.message = WM_KEYDOWN) then begin
Handled := ProcessKeyForBrowser(Msg);
if Handled then exit;
end;
Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
if (Handled) and (not WebBrowser1.Busy) then begin
Dispatch := WebBrowser1.Application;
if Dispatch <> nil then begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nil then begin
FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject <> nil then begin
if ((Msg.message = WM_KeyDown) or (Msg.message = WM_KeyUp)) and
((Msg.wParam = VK_Back) or // ←ここを外すとBkspが有効になる。
//しかし,テキスト編集エリアで押したとき,Bkspが二重に入力されてしまう。
//(カーソル前の文字が2文字消えてしまう。)
(Msg.wParam = VK_Up) or (Msg.wParam = VK_Down) or
(Msg.wParam = VK_Left) or (Msg.wParam = VK_Right)) then
else
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;
end;
//
procedure TForm1.FormDestroy(Sender: TObject);
begin
FOleInPlaceActiveObject := nil;
end;
initialization
OleInitialize(nil);
finalization
OleUninitialize;
ツイート | ![]() |