Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как сделать так, чтобы работали команды Cut, Copy в WebBrowsere

Delphi , Интернет и Сети , Браузер

Как сделать так, чтобы работали команды Cut, Copy в WebBrowsere

Будущий сайт компании Yahoo! в домене Европейского Союза: www.yahoo.eu

Вам нужно добавить следующие строки в начало unit:


initialization
  OleInitialize(nil);

finalization
  OleUninitialize;

Это не ошибка. Информацию по данному вопросу можно найти на сайте Microsoft KnowledgeBase статья Q168777. Приведённый ниже код, устраняет данную проблему:


...

var
  Form1: TForm1;
  FOleInPlaceActiveObject: IOleInPlaceActiveObject;
  SaveMessageHandler: TMessageEvent;

...

implementation

...

procedure TForm1.FormActivate(Sender: TObject);
begin
  SaveMessageHandler := Application.OnMessage;
  Application.OnMessage := MyMessageHandler;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  Application.OnMessage := SaveMessageHandler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.OnMessage := SaveMessageHandler;
  FOleInPlaceActiveObject := nil;
end;

procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
  iOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
begin
  { exit if we don't get back a webbrowser object }
  if WebBrowser = nil then
  begin
    Handled := False;
    Exit;
  end;

  Handled:=(IsDialogMessage(WebBrowser.Handle, Msg) = True);

  if (Handled) and (not WebBrowser.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := WebBrowser.Application;
      if Dispatch <> nil then
      begin
        Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
        if iOIPAO <> nil then
          FOleInPlaceActiveObject := iOIPAO;
      end;
    end;

    if FOleInPlaceActiveObject <> nil then
      if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
         ((Msg.wParam = VK_BACK) or (Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then
        //nothing - do not pass on Backspace, Left or Right arrows
      else
        FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;
end;

Перевод контента на русский язык:

Чтобы сделать команды Cut и Copy работать в вашем WebBrowser, вам нужно реализовать интерфейс IOleInPlaceUIWindow в классе TForm1. Этот интерфейс отвечает за обработку операций, связанных с пользовательским интерфейсом, таких как Cut, Copy, Paste и т.д.

Вот обновленный код-снippet, который включает реализацию интерфейса IOleInPlaceUIWindow:

type
  TForm1 = class(TForm)
    WebBrowser: TWebBrowser;
    procedure FormActivate(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
  end;

implementation

procedure TForm1.FormActivate(Sender: TObject);
begin
  SaveMessageHandler := Application.OnMessage;
  Application.OnMessage := MyMessageHandler;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  Application.OnMessage := SaveMessageHandler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.OnMessage := SaveMessageHandler;
  FOleInPlaceActiveObject := nil;
end;

procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
var
  iOIPAO, IOIPUIWindow: IOleInPlaceUIWindow;
  Dispatch: IDispatch;
begin
  { выйти, если мы не получаем возвращаемый объект WebBrowser }
  if WebBrowser = nil then
  begin
    Handled := False;
    Exit;
  end;

  Handled := (IsDialogMessage(WebBrowser.Handle, Msg) = True);

  if (Handled) and (not WebBrowser.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := WebBrowser.Application;
      if Dispatch <> nil then
      begin
        Dispatch.QueryInterface(IOleInPlaceUIWindow, IOIPUIWindow);
        if IOIPUIWindow <> nil then
          FOleInPlaceUIWindow := IOIPUIWindow;
      end;
    end;

    if FOleInPlaceActiveObject <> nil then
      if (Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP) then
      begin
        { обрабатывать команды Cut, Copy, Paste }
        case Msg.wParam of
          VK_C:
            begin
              // реализовать команду Cut
              Handled := True;
            end;
          VK_X:
            begin
              // реализовать команду Copy
              Handled := True;
            end;
          VK_V:
            begin
              // реализовать команду Paste
              Handled := True;
            end;
        end;
      end;

    if FOleInPlaceActiveObject <> nil then
      FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;
end;

Обратите внимание, что вам нужно реализовать логику для команд Cut, Copy и Paste в процедуре MyMessageHandler. Вы можете использовать методы WebBrowser или доступ к underlying HTML-документу для выполнения этих операций.

Также убедитесь, что включаете unit OleCtrls в ваш список используемых:

uses
  OleCtrls;

Эта unit предоставляет интерфейс IOleInPlaceUIWindow и другие необходимые типы для работы с COM-контролами, такими как WebBrowser.

Статья описывает решение проблемы с работой команд Cut и Copy в WebBrowser, которое заключается в обработке сообщений с помощью процедуры MyMessageHandler.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-12 15:35:10/0.0041749477386475/0