Wie kontrolliere ich den optischen Zoom in einer laufenden "Internet Explorer_Server" -Instanz?

8

Windows Live Writer hostet ein Internet Explorer-Steuerelement zum Bearbeiten, aber es gibt kein Zoom-Steuerelement. Ich möchte in der Lage sein, einen Zoom-Befehl zu senden. Da andere Anwendungen den IE-Browser hosten, würde ich denken, dass ein Dienstprogramm, das Zoom-Befehle an bestimmte IE-Browser-Instanzen senden kann, wirklich praktisch ist, aber ich habe keins gefunden.

Ich habe gesehen, dass es einen Befehl gibt, OLECMDID_OPTICAL_ZOOM , aber ich bin mir nicht sicher, wie ich diesen Befehl senden soll. Im Idealfall möchte ich dies von C # oder Powershell machen.

Hinweis : Bei der Frage handelt es sich um die Steuerung des Zooms in einem Webbrowser-Steuerelement in einer laufenden Anwendung, die ich nicht erstellt habe. Das Hauptbeispiel ist die Editoroberfläche in Windows Live Writer.

>     
Jon Galloway 26.05.2011, 22:09
quelle

3 Antworten

5

Kurzfassung: Ich bin mir nicht ganz sicher, ob Sie das tun können, was Sie tun möchten.

Ich habe Code, der das HTML-Dokument innerhalb des WLW-Fensters tatsächlich handhabt, und das funktioniert, aber was ich finde, ist, dass ich keinen Verweis auf das übergeordnete Fenster des Dokuments bekommen kann. Ich bin kein nativer Windows-Typ, aber ich habe in meiner Zeit etwas PInvoke gemacht. Es kann nur sein, dass mein Mangel an nativem Windows-Wissen mich daran hindert, die letzte Lücke zu schließen.

Was ich zusammengestellt habe, ist der allgemeine Prozess, um einen Verweis auf ein IE-Fenster zu erhalten:

  1. Erhalte eine Referenz für das Fenster der obersten Ebene.
  2. Suchen Sie das Fenster mit dem HTML-Dokument dort (rekursive Suche).
  3. Ruft das HTML-Dokumentobjekt aus diesem Fenster ab.
  4. Ruft das übergeordnete Fenster des HTML-Dokuments auf (das IE-Fenster).

Sobald Sie dieses übergeordnete Fenster haben, können Sie die IWebBrowser2.ExecWB-Methode aufrufen, um Ihren OLE-Zoombefehl auszuführen.

Das Problem ist, dass die IHTMLDocument2.parentWindow-Eigenschaft immer eine InvalidCastException zu werfen scheint, wenn Sie versuchen, darauf zuzugreifen. Aus was ich ' lesen , das ist das Problem, wenn Sie versuchen, das übergeordnete Fenster von einem anderen Thread als dem zu greifen auf dem das Dokument ausgeführt wird.

Wie auch immer, ich werde den Code auf Sie fallen lassen, der den HTML-Dokumentverweis bekommt, und wenn Sie diesen kleinen letzten Schritt des Weges überbrücken können, werden Sie Ihre Antwort haben. Ich konnte es einfach nicht selbst herausfinden.

Dies ist eine Konsolen-App. Sie benötigen einen Verweis auf Microsoft.mshtml für die Schnittstelle IHTMLDocument2.

%Vor%     
Travis Illig 07.06.2011, 23:17
quelle
1

Ich habe darüber nachgedacht, und mir fällt ein, dass wir eine alte Technik aus den Win32-Tagen (Pre OLE, COM + und all dieser Jazz), Sendkeys

, verwenden könnten

Im Wesentlichen müssen Sie mithilfe der win32-API das Fensterhandle des Hauptfensters des Live-Writers finden und dann von dort aus die Objekthierarchie der App durchlaufen, bis Sie das Web-Steuerelement finden.

Sobald Sie das Handle zu diesem Objekt haben (Spy ++ wird Ihnen zeigen, ob es zugänglich ist oder nicht) sollten Sie theoretisch in der Lage sein, beliebige Tastenkombinationen zu senden, die wiederum von der Nachrichtenpumpe der Apps behandelt werden als ob der Tastendruck von der App selbst stammt.

Ich habe versucht, den Ansatz zu testen, aber es hängt davon ab, ob die App tatsächlich einen Tastendruck ausführt und darauf reagiert, um die erforderliche Funktion in ihrem Code auszuführen. Wie ich beim Testen herausgefunden habe, scheint es in der Eltern-App keinen Bearbeitungscode zu geben, der auf den Zoom reagiert. Daher bin ich mir nicht sicher, ob der Ansatz funktionieren würde.

Wenn Sie jedoch etwas erweitern, ist es nicht schwer, Plug-Ins für Live-Writer zu schreiben, sobald Sie das SDK haben, also denke ich, dass die Lösung dieses Problems eine Mischung aus:

sein wird

Ein Live-Writer-Plug-In, um Befehle anzunehmen, die von einem Remote-Agenten gesendet wurden

Ein Remote-Agent, der eine Methode in derselben Richtung wie die Schlüssel zum Senden von Nachrichten an das Plug-in verwendet

Code im Plugin, basierend auf dem Code in meinem Beispielprojekt, der die Browsersteuerung in situ findet und dann, wo nötig, die Zoom-Methoden aufruft.

Ich habe jedoch keine Zeit, dies im Moment zu lesen: - (

    
shawty 04.06.2011 11:29
quelle
1

Es ist ziemlich einfach ....

Sie müssen das normale Webbrowser-Steuerelement überschreiben, indem Sie eine abgeleitete Klasse erstellen.

Diese abgeleitete Klasse wird dann verwendet, um auf die zugrunde liegende ActiveX-Implementierung des übergeordneten Webbrowser-Steuerelements zuzugreifen. An diesem Punkt können Sie auf die 'ExecWB' -Methode zugreifen, die im Standardobjekt leider nicht öffentlich verfügbar gemacht wird.

>

Sobald Sie dieses zugrundeliegende Objekt haben, können Sie einfach nur beliebige öffentliche Methoden wie z. B. Zoom bereitstellen und diese dann direkt an die activeX-Schnittstelle übergeben.

Ich habe ein kleines winforms-Programm geschrieben, um zu zeigen, wie es funktioniert. Ich habe das Projekt hier auf mein MSN-Sky-Laufwerk hochgeladen:

Webbrowser-Zoom

    
shawty 01.06.2011 22:08
quelle