Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Browser Via Delphi aktualisieren/ (https://www.delphipraxis.net/137901-browser-via-delphi-aktualisieren.html)

sentinel81 30. Jul 2009 17:36


Browser Via Delphi aktualisieren/
 
Moin!
Ich habe für einen Infomonitor ein kleines Programm geschrieben, welches einen Browser neu laden soll und wenn er nicht gestartet ist, starten soll.
Da Chrome der einzige Browser ist, der auf Tastendrücke per PostMessage reagiert, habe ich mich entschlossen Chrome zu nehmen.
(Falls jemand einen Vorschlag hat, wie das mit Opera oder Firefox funkionieren könnte, würde ich das auch sehr begrüßen ;))

Allerdings habe ich auch mit Chrome einige Probleme:
1. Chrome muss den Fokus wiederbekommen, bevor er ein 2. mal F5 gesendet werden kann. Leider habe ich nicht hinbekommen den Fokus auf Chrome zu setzen. Meine Recherchen haben ergeben, dass die mit ShowWindow gehen sollte, leider hab ich es nicht hinbekommen.
2. Nach dem Start soll Chrome in den Vollbildmodus gebracht werden, was mit einem Senden von F11 funktioniert.
Wenn dies während des laufenden Programms geschieht - kein Problem. Leider wird diese Funktion bei FormCreate aufgerufen und dort funktioniert es nicht mehr so einfach. Wenn man vorher ShowMessage('Vollbildmodus wird gestartet') Aufruft und dies bestätigt funktioniert es wieder.
Leider hat Chrome keinen Startparameter, mit dem man es im Vollbildmodus starten könnte.

Hat jemand eine Idee woran es liegen könnte? Mit wartezeiten habe ich auch schon ein wenig experimentiert, hat aber nichts gebracht.

Hier nochmal der gesamte Code:


Delphi-Quellcode:
procedure TFChrome.FormCreate(Sender: TObject);
var
  HFenster: HWND;
  sHTML: string;
  boChrome: Boolean;
  boMeldung : Boolean;
  iWartezeit1,iWartezeit2,iWartezeit3 : Integer;
  SLEinstellungen : TStringList;
begin
  SLEinstellungen := TStringList.Create;
  try
    SLEinstellungen.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'chrome.cfg');
    if SLEinstellungen[0] = '1' then
      boMeldung := True
    else
      boMeldung := False;
    iWartezeit1 := 500;
    iWartezeit2 := 500;
    iWartezeit3 := 500;
    TryStrToInt(SLEinstellungen[1],iWartezeit1);
    TryStrToInt(SLEinstellungen[2],iWartezeit2);
    TryStrToInt(SLEinstellungen[3],iWartezeit3);

  finally
    SLEinstellungen.Free
  end;
  HFenster := FindWindow('Chrome_WidgetWin_0',0);
  sHTML := '"' + ExtractFilePath(ParamStr(0)) + '..\infodisplay.html' + '"';
  if HFenster = 0 then
  begin
    boChrome := True;
    if FileExists(GetEnvironmentVariable('appdata')+'\..\Local\Google\Chrome\Application\chrome.exe') then
      ShellExecute(Application.Handle,nil,PChar(GetEnvironmentVariable('appdata')+'\..\Local\Google\Chrome\Application\chrome.exe'),PChar(sHTML),'',SW_SHOW)
    else
      if FileExists(GetEnvironmentVariable('temp') + '\..\Anwendungsdaten\Google\Chrome\Application\chrome.exe') then
        ShellExecute(Application.Handle,nil,PChar(GetEnvironmentVariable('temp') + '\..\Anwendungsdaten\Google\Chrome\Application\chrome.exe'),PChar(sHTML),'',SW_SHOW)
      else
      begin
        ShowMessage('Chrome wurde nicht gefunden!');
        boChrome:= False;
      end;
    if boChrome then
    begin
      Sleep(iWartezeit1);
      HFenster := FindWindow('Chrome_WidgetWin_0',nil);
      if boMeldung then
        ShowMessage('Vollbildmodus wird gestartet');
      Sleep(iWartezeit2);
      ShowWindow(HFenster,SW_NORMAL);
      PostMessage(HFenster,WM_KEYDOWN,VK_F11,0);
      PostMessage(HFenster,WM_KEYUP,VK_F11,0);
    end;

  end;
  ShowWindow(HFenster,SW_NORMAL);
  PostMessage(HFenster,WM_KEYDOWN,VK_F5,0);
  PostMessage(HFenster,WM_KEYUP,VK_F5,0);
  Sleep(iWartezeit3);

  Application.Terminate;

end;
Mit freundlichen Grüßen

sentinel81

Die Muhkuh 30. Jul 2009 18:07

Re: Browser Via Delphi aktualisieren/
 
Musst Du den Umweg über einen Browser gehen?

Alternativ TWebBrowser nutzen oder Indys, je nach dem, was Du machen musst.

sentinel81 31. Jul 2009 12:39

Re: Browser Via Delphi aktualisieren/
 
Ich werds mal wenn ich Zeit hab damit ausprobieren. Ich hab mich damit allerdings noch nie beschäftigt, und der externe Browser war eben die einfachste und schnellste Lösung für mich.

mfg
sentinel81

Sprint 31. Jul 2009 13:09

Re: Browser Via Delphi aktualisieren/
 
Zitat:

Zitat von sentinel81
(Falls jemand einen Vorschlag hat, wie das mit Opera oder Firefox funkionieren könnte, würde ich das auch sehr begrüßen ;))

Mit dem Internet Explorer geht das Laden und Refreshen recht einfach.

Delphi-Quellcode:
{...}

uses
  ShDocVw;

{...}

var
  IE: IWebBrowser2 = nil;

{...}

procedure TForm1.Button1Click(Sender: TObject);
var
  URL: OleVariant;
begin
  if Assigned(IE) then
  begin
    IE.Refresh;
  end else
  begin
    URL := 'http://www.heise.de/newsticker';
    IE := CoInternetExplorer.Create;
    IE.Navigate2(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
    IE.Visible := True;
  end;
end;

Sprint 2. Aug 2009 23:27

Re: Browser Via Delphi aktualisieren/
 
Mit dem "Assigned" ist ja völliger Quatsch. Wenn das Fenster vom IE geschlossen wird, dann knallt es.
Also hier mal ein anderes Beispiel. Es wird vorher geprüft, ob die Instanz vom IE noch vorhanden ist.
Wenn ja, wird ein Refresh durchgeführt. Ansonsten wird eine neue Instanz erstellt.

Delphi-Quellcode:
{...}

uses
  ShDocVw, MSHTML;

{...}

var
  IE: IWebBrowser2;

{...}

procedure TForm1.Button5Click(Sender: TObject);
var
  I: Integer;
  SHW: IShellWindows;
  Doc: IHTMLDocument2;
  MustNewCreate: Boolean;
  URL: OleVariant;
begin

  URL := 'http://www.heise.de/newsticker/';
  MustNewCreate := True;
  SHW := CoShellWindows.Create;

  for I := 0 to SHW.Count - 1 do
    if (SHW.Item(I) as IWebBrowser2) = IE then
    begin
      if IE.Document <> nil then
        if IE.Document.QueryInterface(IHTMLDocument2, Doc) = S_OK then
          if IE.LocationURL = URL then
            IE.Refresh
          else
            IE.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
      MustNewCreate := False;
    end;

  if MustNewCreate then
  begin
    IE := CoInternetExplorer.Create;
    IE.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam);;
    IE.Visible := True;
  end;

end;
Könnte mir vorstellen, das sowas ähnliches mit Mozilla auch möglich wäre. Denke aber, das es eine Steuerung über Ole/DDE mit Chrome und Opera nicht gibt.

sentinel81 16. Aug 2009 12:26

Re: Browser Via Delphi aktualisieren/
 
Vielen Dank Sprint! Das ist natürlich die optimale Lösung.
Auch wenn ich nicht damit gerechnet hätte, dass mir jemand eine Lösung mit dem Internet Explorer präsentiert :D.

mfg
Sentinel81


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz