Come rendere TWebBrowser ignorare acceleratore caratteri degli altri controlli?
-
25-09-2019 - |
Domanda
Ho un TWebBrowser collocato su un modulo con il designMode abilitato.
Urlare il browser ho un pulsante di chiusura con il set Caption 'Clos & e'.
Quando sto modificando i contenuti di un documento all'interno del browser web e premo il tasto E il pulsante di chiusura è chiamato.
Sembra che si sta trattando TWebBrowser come gli altri controlli che non gestiscono le chiavi e / o non accettano caratteri (ad esempio TButton).
Come posso risolvere questo problema?
Grazie in anticipo.
Soluzione
scendono dal TWebBrowser, eseguire l'override del gestore di messaggi CN_CHAR
e 0
ritorno. Attivazione del collegamento con Alt+E
continuerà a funzionare.
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;
Altri suggerimenti
In vostra unità, dichiarare
var
WebBrowserHandle: HWND;
e
function EnumChildProc(h: HWND; p: LPARAM): boolean; stdcall;
Nella sezione implementazione, scrittura
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;
Ora aggiungere un componente TApplicationEvents, e utilizzare l'evento 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;