Как заставить TWebBrowser игнорировать символы акселератора других элементов управления? - PullRequest
2 голосов
/ 08 апреля 2010

У меня есть TWebBrowser, помещенный в форму с включенным режимом designMode.
У меня есть браузер, у которого есть кнопка закрытия с надписью «Clos & e».
Когда я редактирую содержимое документа в веб-браузере и нажимаю клавишу E, вызывается кнопка закрытия.
Похоже, что он обрабатывает TWebBrowser как другие элементы управления, которые не обрабатывают ключи и / или не принимают символы (например, TButton).

Как я могу решить это?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 09 апреля 2010

Выход из TWebBrowser, переопределение обработчика сообщений CN_CHAR и возврат 0. Сочетание клавиш Alt+E все равно будет работать.

type
  TWebBrowser = class(SHDocVw.TWebBrowser)
    procedure CNChar(var Message: TWMChar); message CN_CHAR;
  end;

...

procedure TWebBrowser.CNChar(var Message: TWMChar);
begin
  Message.Result := 0;
end;
0 голосов
/ 09 апреля 2010

В вашем устройстве объявите

var
  WebBrowserHandle: HWND;

и

function EnumChildProc(h: HWND; p: LPARAM): boolean; stdcall;

В разделе реализации напишите

function EnumChildProc(h: HWND; p: LPARAM): boolean; stdcall;
var
  TestClassName: array[0..31] of AnsiChar;
begin
  GetClassNameA(h, @TestClassName, 32);
  result := not SameStr(TestClassName, 'Internet Explorer_Server');
  if not result then
    WebBrowserHandle := h;
end;

Теперь добавьте компонент TApplicationEvents и используйте событие OnShortCut:

procedure TForm1.ApplicationEvents1ShortCut(var Msg: TWMKey;
  var Handled: Boolean);
var
  h: HWND;
begin
  WebBrowserHandle := 0;
  h := FindWindowEx(Handle, 0, 'Shell Embedding', nil);
  EnumChildWindows(h, @EnumChildProc, 0);
  if WebBrowserHandle = GetFocus then
    Handled := true;
end;
...