WebBrowserでのBackSpaceキーの動作について


まこと  2007-06-11 07:16:13  No: 26578

いつもお世話になっております。

昨日も別の質問をさせていただいたばかりですが,別口でもう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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加