WebBrowser i Focus

0

Witam

Mam pewien problem z oprogramowaniem TWebBrowser w Delphi, już tłumacze o co mi chodzi:

Mamy prosty program składający się z dwóch form, na jednej jest wstawiona przeglądarka TWebBrowser albo TEmbenddedWB, a na głównej formie jest porostu przycisk, kiedy naciśniemy przycisk zostaje wywołana taka funkcja Form2.WB.Navigate('https://moj.multibank.pl/') czyli otwarcie strony logowania do banku (proszę sobie wejść na tą stronę) iiiii problem jest taki, bo po wczytaniu tej strony w WebBrowserze uruchamiane są normalnie JavaScripty na tej stronie i z tego co widzimy, automatycznie ustawia się Focus pola z numerem karty - ustawia się tam kursor. I tutaj dzieją się w moim programie rzeczy nie pożądane bo automatycznie ustawia się aktywny formularz z WebBrowserem a ja tego nie chcę , chce żeby cały proces wczytywania strony dział się niewidocznie , pod spodem w tle, a nie żeby mi zmiana Focusa kolidowała prace programu na froncie. I teraz nie wiem jak to ominąć, czy może przejęcie Messagów rozwiąże problem, czy może lepiej przefiltrować wczytywaną stronę tak żeby wymazać z niej kod odpowiedzialny za zmianę focusa - tylko jak to zrobić???? Może ktoś z Was ma jakąś receptę na ten natrętny problem :)

Pozdrawiam
Piotr

ps. niestety muszę używać webbrowsera w swoim programie bo musi on symulować w pełni sprawną przeglądarkę, taką co poradzi sobie ze skomplikowanymi stronami(javas,activex,vbbasic inne wynalazki).

0

Widzę że problem z pozoru błachy jednak jest problemem ale dużym, w SPACJA końcu znalazłem rozwiązanie, ale troche jest to sposób jakby to nieczysty czyli niezgodny z regułami programowania w windows ale działa ... zobaczymy jak się to będzie zachowywać w różnych środowiskach - wersja systemu i IE.

Otóż aby uniknąć automatycznego przełączania aktywności formularza-Webbrowsera po zmianie focusa przez powiedzmy funkcje javascriptu wbudowaną w strone trzeba przejąć Messaga WM_PAINT w procedurze WndProc w komponencie TEmbedded (webbrowserze) i wyzerować pole z numerem messaga. Wygląda to tak że nic się nierysuje ani nie ustawia na aktywne (focus) ale działa navigowanie po stronie. Wpadłem na to dopiero dzisiaj w nocy iiii dopiero będe testować :) mam nadzieje że to rozwiąże moj problem nie tworząc innych problemów alawebbrowserowych :)

0

Errata do ostatniej mojej wypowiedzi............otóż nie działa to tak jak pisałem z tym przejęciem messaga WM_PAINT, rozwiązanie znalazłem na innej grupie z dużą pomocą IONIC...gazeta.pl ,
także zaprezentuje przykład jak uniknąć automatycznego focusowania webbrowsera podczas wchodzenia np na stronę multibanku.

//---------------------------------------------------------------------------------------------------
UNIT main;

INTERFACE

USES Windows, SysUtils, Classes, Controls, Forms, ExtCtrls, Menus,
StdCtrls,
  OleCtrls, SHDocVw_TLB, Mshtml_TLB;

TYPE
  // Nowy typ - wskaźnik tablicy wartość DWORD
  PXBINT = ARRAY OF DWORD;

  TmainFrm = CLASS(TForm)
    Memo1: TMemo;
    Button1: TButton;
    WebBrowser1: TWebBrowser;
    PROCEDURE FormCreate(Sender: TObject);
    PROCEDURE Button1Click(Sender: TObject);
  PRIVATE
    { Private declarations }
  PUBLIC
    { Public declarations }
  END;

VAR
  mainFrm: TmainFrm;

  unk: IUnknown; // Podręczny wskaźnik obiektu
  document: IHTMLDocument2; // Interface dokumentu webbrowsera
  window: IHTMLWindow2; // Interface okienka webbrowsera
  path: ARRAY[0..2] OF uchar = (194, 4, 0); // ret 4 , czyli kod
odpowiedzialny za nic, czyli nic nierób
  element: IHTMLElement2; // Interface elementu html

IMPLEMENTATION

{$R *.dfm}

PROCEDURE TmainFrm.FormCreate(Sender: TObject);
VAR
  tmp: Cardinal;
BEGIN
  // Zainicjowanie okienka webebrosera
  WebBrowser1.GoHome;

  // Odczytanie interejsu dokumentu
  unk := WebBrowser1.ControlInterface.get_Document();
  unk.QueryInterface(IID_IHTMLDocument2, document);
  // Odczytanie interfacu okienka webbrowsera
  window := document.get_parentWindow;
  // Nadpisanie kodu procedury odpowiedzialnej za aktywowanie okienka
webbrowsera
  WriteProcessMemory(
    GetCurrentProcess(),
    Pointer(PXBINT(PXBINT(window)[0])[59]),
    @path, 3,
    tmp);

  // Nadpisanie kodu procedury za programową zmiane focusa elementu w
webbrowserze
  unk := document.createElement('A');
  unk.QueryInterface(IID_IHTMLElement2, element);
  WriteProcessMemory(
    GetCurrentProcess(),
    Pointer(PXBINT(PXBINT(element)[0])[50]),
    @path, 3,
    tmp);
END;

PROCEDURE TmainFrm.Button1Click(Sender: TObject);
BEGIN
  Memo1.setfocus;
  WebBrowser1.Navigate('https://moj.multibank.pl/');
END;

END.
//--------------------------------------------------------------------------------------------------- 

[soczek]

1 użytkowników online, w tym zalogowanych: 0, gości: 1