EmbeddedWebbrowser kullanarak yaptığım bir uygulama var. Bu Browser'ın OnNewWindows3 olayında aynı formu tekrar crate ediyorum ve doğal olarak açılan tüm popup pencereleri aynı browser üzerinden yönetiyorum.
Tüm browserlarda olduğu gibi embeddedwebbrowser da da enter tuşunu gönderme olayında sorun yaşıyorum. Şöyle bir durum var. Enter tuşunu gönderebilmek için Application.OnMessage metoduna özel olarak yazılmış aşağıdaki metod atanıyor. Ancak webbrowser'ın OnCloseQuery olayı gerçekleştiğinde bu OnMessage olayındaki IsDialogMessage metodu yine bir Message gönderdiği için metod rekürsif olarak kendini çağırıyor ve sonsuz döngüye giriyor program. Verilen örnek sanırım tek browser için düşünülmüş. Bu konudaki sıkıntıyı nasıl aşabileceğim konusunda fikri olan var mı?
Kod: Tümünü seç
Application.OnMessage := MsgHandler; // Create de çalışıyor
procedure TfrmWebBrowser2.MsgHandler(var Msg: TMsg; var Handled: Boolean);
const
StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT];
var
IOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
success: boolean;
begin
if (ebwebBrowser = nil) then
begin
Handled := False;
Exit;
end;
success := IsDialogMessage(ebwebBrowser.Handle, Msg);
Handled := (Success);
if (Handled) and (not ebwebBrowser.Busy) then
begin
if FOleInPlaceActiveObject = nil then
begin
Dispatch := ebwebBrowser.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 in StdKeys) then
//nothing - do not pass on Backspace, Left, Right, Up, Down arrows
else FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;