Это не ошибка. Информацию по данному вопросу можно найти на сайте 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 = nilthenbegin
Handled := False;
Exit;
end;
Handled:=(IsDialogMessage(WebBrowser.Handle, Msg) = True);
if (Handled) and (not WebBrowser.Busy) thenbeginif FOleInPlaceActiveObject = nilthenbegin
Dispatch := WebBrowser.Application;
if Dispatch <> nilthenbegin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nilthen
FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject <> nilthenif ((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 arrowselse
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;
Перевод контента на русский язык:
Чтобы сделать команды Cut и Copy работать в вашем WebBrowser, вам нужно реализовать интерфейс IOleInPlaceUIWindow в классе TForm1. Этот интерфейс отвечает за обработку операций, связанных с пользовательским интерфейсом, таких как Cut, Copy, Paste и т.д.
Вот обновленный код-снippet, который включает реализацию интерфейса IOleInPlaceUIWindow:
typeTForm1=class(TForm)WebBrowser:TWebBrowser;procedureFormActivate(Sender:TObject);procedureFormDeactivate(Sender:TObject);procedureFormClose(Sender:TObject;varAction:TCloseAction);procedureMyMessageHandler(varMsg:TMsg;varHandled:Boolean);end;implementationprocedureTForm1.FormActivate(Sender:TObject);beginSaveMessageHandler:=Application.OnMessage;Application.OnMessage:=MyMessageHandler;end;procedureTForm1.FormDeactivate(Sender:TObject);beginApplication.OnMessage:=SaveMessageHandler;end;procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);beginApplication.OnMessage:=SaveMessageHandler;FOleInPlaceActiveObject:=nil;end;procedureTForm1.MyMessageHandler(varMsg:TMsg;varHandled:Boolean);variOIPAO,IOIPUIWindow:IOleInPlaceUIWindow;Dispatch:IDispatch;begin{ выйти, если мы не получаем возвращаемый объект WebBrowser }ifWebBrowser=nilthenbeginHandled:=False;Exit;end;Handled:=(IsDialogMessage(WebBrowser.Handle,Msg)=True);if(Handled)and(notWebBrowser.Busy)thenbeginifFOleInPlaceActiveObject=nilthenbeginDispatch:=WebBrowser.Application;ifDispatch<>nilthenbeginDispatch.QueryInterface(IOleInPlaceUIWindow,IOIPUIWindow);ifIOIPUIWindow<>nilthenFOleInPlaceUIWindow:=IOIPUIWindow;end;end;ifFOleInPlaceActiveObject<>nilthenif(Msg.message=WM_KEYDOWN)or(Msg.message=WM_KEYUP)thenbegin{ обрабатывать команды Cut, Copy, Paste }caseMsg.wParamofVK_C:begin// реализовать команду CutHandled:=True;end;VK_X:begin// реализовать команду CopyHandled:=True;end;VK_V:begin// реализовать команду PasteHandled:=True;end;end;end;ifFOleInPlaceActiveObject<>nilthenFOleInPlaceActiveObject.TranslateAccelerator(Msg);end;end;
Обратите внимание, что вам нужно реализовать логику для команд Cut, Copy и Paste в процедуре MyMessageHandler. Вы можете использовать методы WebBrowser или доступ к underlying HTML-документу для выполнения этих операций.
Также убедитесь, что включаете unit OleCtrls в ваш список используемых:
usesOleCtrls;
Эта unit предоставляет интерфейс IOleInPlaceUIWindow и другие необходимые типы для работы с COM-контролами, такими как WebBrowser.
Статья описывает решение проблемы с работой команд Cut и Copy в WebBrowser, которое заключается в обработке сообщений с помощью процедуры MyMessageHandler.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.