Plugins für Internet Explorer erstellen

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von StarGate01.

      Plugins für Internet Explorer erstellen

      Hallo liebe VB-P'ler,

      Vorwort
      Heute will ich euch zeigen wie ihr für den ganz normalen Internet Explorer Addons/Plugins mit .NET erstellen könnt.
      Dies soll nur ein Tutorial sein und nicht zu einer Diskussion über den IE ausarten.
      Ich habe diese Vorgehensweise auf Windows7 32 Bit mit dem IE9 in VB Express 2010 getestet.

      Funktionsweise
      Plugins für den IE sind dll-Dateien.
      Diese dll-Dateien müssen einfach nur registiert und im IE aktiviert werden, und Bäm ist man fertig.



      Ziel dieser Demo: Auf der Seite google.de ein kleines Textfeld einzufügen (Natürlich nur Clientseitig :D)

      Schritt 1: Das Projekt erstellen
      Spoiler anzeigen
      Also Projekttyp wählt man eine Klassenbibliothek an und gibt ihr einen sinnvollen Namen, ich nehme mal "HalloIE".
      Als nächstes benennt man im Dateifenster rechts die Datei "Class1.vb" in "BHO.vb" um.
      Dann setzt man das Häkchen bei My Project->Anwendung->Assembyinformationen->"Assembly-COM sichtbar machen".
      Als nächtes die erforderlichen Verweise hinzufügen:
      Microsoft.mshtml und
      C:\\Windows\system32\shdocvw.dll


      Schritt 2: Das Grundgerüst
      Spoiler anzeigen
      Zuersteinmal die Imports:

      VB.NET-Quellcode

      1. Imports SHDocVw
      2. Imports mshtml
      3. Imports Microsoft.Win32
      4. Imports System.Runtime.InteropServices

      Als nächstes das Interface (GUID nicht ändern!!!):

      VB.NET-Quellcode

      1. <ComVisible(True), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")> _
      2. Public Interface IObjectWithSite
      3. <PreserveSig()> _
      4. Function SetSite(<MarshalAs(UnmanagedType.IUnknown)> site As Object) As Integer
      5. <PreserveSig()> _
      6. Function GetSite(ByRef guid As Guid, ByRef ppvSite As IntPtr) As Integer
      7. End Interface

      Dann die Klasse (Auch hier: GUID nicht ändern!):

      VB.NET-Quellcode

      1. <ComVisible(True), Guid("2159CB25-EF9A-54C1-B43C-E30D1A4A8277"), ClassInterface(ClassInterfaceType.None)> _
      2. Public Class BHO
      3. Implements IObjectWithSite
      4. Private webBrowser1 As WebBrowser
      5. End Class

      Damit wäre unser Grundgerüst schon einmal fertig.


      Schritt 3: Implementierung des BHO-Interfaces
      Spoiler anzeigen
      Als BHO (Browser Helping Object) müssen wir bestimmte Funktionen implementieren:

      VB.NET-Quellcode

      1. Public Function SetSite(site As Object) As Integer Implements IObjectWithSite.SetSite
      2. If site IsNot Nothing Then
      3. webBrowser1 = DirectCast(site, WebBrowser)
      4. AddHandler webBrowser1.DocumentComplete, AddressOf Me.OnDocumentComplete
      5. 'Hier könnten noch weitere Eventhandler folgen, für unsere Zwecke reicht dieser eine.
      6. Else
      7. RemoveHandler webBrowser1.DocumentComplete, AddressOf Me.OnDocumentComplete
      8. 'Die Eventhandler müssen auch wider entfernt werden.
      9. webBrowser1 = Nothing
      10. End If
      11. Return 0
      12. End Function
      13. Public Function GetSite(ByRef guid As Guid, ByRef ppvSite As IntPtr) As Integer Implements IObjectWithSite.GetSite
      14. Dim punk As IntPtr = Marshal.GetIUnknownForObject(webBrowser1)
      15. Dim hr As Integer = Marshal.QueryInterface(punk, guid, ppvSite)
      16. Marshal.Release(punk)
      17. Return hr
      18. End Function


      Schritt 4: Die eigentliche Verarbeitung
      Spoiler anzeigen
      Kümmern wir uns nun um den Kern der Sache.

      VB.NET-Quellcode

      1. Public Sub OnDocumentComplete(pDisp As Object, ByRef URL As Object)
      2. Dim document As HTMLDocument = DirectCast(webBrowser1.Document, HTMLDocument)
      3. Dim head As IHTMLElement = DirectCast(DirectCast(document.all.tags("head"), IHTMLElementCollection).item(Nothing, 0), IHTMLElement)
      4. End Sub

      In dieser Prozedur stehen uns nun einige Objekte zu Verfügung: Die aktuelle URL, und ein HTMLDocument-Objekt das wir JavaScript-ähnlich manipulieren können.
      Prüfen wir zuerst, ob wir auf der Google-Seite sind:

      VB.NET-Quellcode

      1. If URL.ToString.Contains("www.google.de") Then
      2. End If

      Als nächstes fügen wir einen Roten Kasten ein:

      VB.NET-Quellcode

      1. 'Zuerst in den Header ein Javascript zum Schließen der Kiste
      2. Dim scriptObject As IHTMLScriptElement = DirectCast(document.createElement("script"), IHTMLScriptElement)
      3. scriptObject.type = "text/javascript"
      4. scriptObject.text = vbCrLf & vbCrLf & "function ausblenden(){document.getElementById('rotekiste1').style.visibility = 'hidden';}" & vbCrLf & vbCrLf
      5. DirectCast(head, HTMLHeadElement).appendChild(DirectCast(scriptObject, IHTMLDOMNode))
      6. 'Dann die eigentliche Rote Kiste
      7. Dim div As String = "<div id='rotekiste1' style='position:absolute; top:50px; left:50px; z-index:9999; background-color:red; border:1px solid black; height:50px; width:200px;' >" & _
      8. "Ich bin ein von einem Plugin eingefügter div<br /><br />" & _
      9. "<a href=""javascript:ausblenden();"">Okay</a></div>"
      10. document.body.insertAdjacentHTML("afterBegin", div)

      Damit wäre die Hautarbeit schon einmal geschafft.


      Schritt 5: Die Installation (Und Deinstallation)
      Spoiler anzeigen
      Die Grundliegenden Installationsvorgänge übernimmt der folgende Code:

      VB.NET-Quellcode

      1. Public Const BHO_REGISTRY_KEY_NAME As String = "Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects"
      2. <ComVisible(True), ComRegisterFunction()> _
      3. Public Shared Sub RegisterBHO(type As Type)
      4. Dim registryKey As RegistryKey = Registry.LocalMachine.OpenSubKey(BHO_REGISTRY_KEY_NAME, True)
      5. If registryKey Is Nothing Then
      6. registryKey = Registry.LocalMachine.CreateSubKey(BHO_REGISTRY_KEY_NAME)
      7. End If
      8. Dim guid As String = type.GUID.ToString("B")
      9. Dim ourKey As RegistryKey = registryKey.OpenSubKey(guid)
      10. If ourKey Is Nothing Then
      11. ourKey = registryKey.CreateSubKey(guid)
      12. End If
      13. ourKey.SetValue("NoExplorer", 1, RegistryValueKind.DWord)
      14. registryKey.Close()
      15. ourKey.Close()
      16. End Sub
      17. <ComVisible(True), ComUnregisterFunction()> _
      18. Public Shared Sub UnregisterBHO(type As Type)
      19. Dim registryKey As RegistryKey = Registry.LocalMachine.OpenSubKey(BHO_REGISTRY_KEY_NAME, True)
      20. Dim guid As String = type.GUID.ToString("B")
      21. If registryKey IsNot Nothing Then
      22. registryKey.DeleteSubKey(guid, False)
      23. End If
      24. End Sub

      Danach wird die dll mit Erstellen->HalloIE Erstellen Kompiliert.
      Nun wenden wir uns den Installations/Deinstallation - Batch - Skripten zu:
      Installation:

      Quellcode

      1. cd "C:\windows\Microsoft.NET\Framework\v4.0.30319"
      2. regasm.exe /codebase "C:\Users\***\Documents\Visual Studio 2010\Projects\HalloIE\HalloIE\bin\Release\HalloIE.dll"
      3. pause

      Deinstallation:

      Quellcode

      1. cd "C:\windows\Microsoft.NET\Framework\v4.0.30319"
      2. regasm.exe /unregister "C:\Users\***\Documents\Visual Studio 2010\Projects\HalloIE\HalloIE\bin\Release\HalloIE.dll"
      3. pause

      BEIDE SKIPTE BENÖTIGEN ADMISISTRATORRECHTE.
      Die Framework-Version(hier v4.0.30319) muss eventuell angepasst werden.
      Spätestens vor der Ausführung dieser Skripte muss der IE beendet werden.


      Schritt 6: Die Aktivierung, Testen und Debugging
      Spoiler anzeigen
      Im IE steht unter "add-ons verwalten" nun ein neues Plugin zu Verfügung: Unser eigenes :).
      Zur Aktivierung reicht ein Klick auf "Aktivieren". (wow)
      Eventuell muss man die Seite neu laden und/oder ÖFFNEN (ja genau so).
      Will man nun sein Plugin updaten, so beendet man den IE, kompiliert die dll erneut und startet den IE wieder.
      Eine Neuinstallation des Plugins ist nicht erforderlich.
      Debugging wie man es von Visual Studio gewohnt ist, ist leider nicht möglich.



      Fazit: Ich hoffe dieses Tutorial hilft dem einem oder anderem, und auch wenn der IE vielleicht nicht der beste Browser ist, so bietet diese Methode doch eine willkommene Möglichkeit, "mal etwas anderes zu tun".
      Ich freue mich natürlich über konstruktive Kritik und Verbesserungsvorschläge.


      Quelle: Codeproject
      Bilder
      • screen1.JPG

        17,72 kB, 562×78, 535 mal angesehen
      • screen2.JPG

        28,44 kB, 778×378, 587 mal angesehen
      SᴛᴀʀGᴀᴛᴇ01

      Plugins für Internet Explorer erstellen: Teil II

      Hallo mal wieder,

      Vorwort
      Heute will ich mein Tutorial fortsetzen und zeigen wie sich das Kontextmenü des IE erweitern lässt.

      Funktionsweise
      Die Kontextmenüeinträge werden über die Registy definiert und können auf lokal gespeicherte Javascript-Dateien verweisen.
      Dieser werden dann im Browserkontext ausgeführt.



      Ziel dieser Demo: Einen Kontextmenüeintag hinzufügen, der beim Klick eine Messagebox anzeigt.

      Schritt 1: Änderungen in der Registy
      Spoiler anzeigen
      Zuerst startet man das programm regedit.exe um den Registry-Editor aufzurufen.
      Als nächtes navigiert man zu dem Schlüssel "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt"
      Dort lassen sich nun als Unterschlüssel Menüeinträge definieren.
      Der Name des Unterschlüsseln definiert den Anzeigenamen des Eintrags.
      Der Standartwert des Unterschlüssels wird nun auf den Pfad der htm-Datei gesetzt.
      Zusätzlich muss ein Hexadezimaler DWORD Wert namens "Contexts" erstellt werden, der bestimmt in welchen Situationen unser Menüeintrag angezigt wird.
      Die Werte sind wie folgt:

      - Default: 0x1
      - Images: 0x2
      - Controls: 0x4
      - Tables: 0x8
      - Text selection: 0x10
      - Anchor: 0x20

      Kobiniert werden können diese mit dem logischen OR.
      Nach dem anlegen des Eintrags widmen wir uns nun dem Javascript-Code.


      Schritt 2: Der Javascript-Code
      Spoiler anzeigen

      Zuerst ertellt man eine *.htm Datei an dem in der Registry angegebenen Ort.
      Wir wollen nur eine Messagebox anzeigen lassen, also ist der Code sehr simpel:

      HTML-Quellcode

      1. <script language="JavaScript">
      2. alert("hallo welt");
      3. </script>

      Danach alles speichern und den IE falls nötig neustarten.


      Schritt 3: Testen und Debugging
      Spoiler anzeigen

      Zum übernehmen der Änderungen an der htm-Datei müsst ihr den IE NICHT neustarten. Das Skipt wird bei jedem Klick auf den Kontextmenüeintag neu geladen.




      Ein konkretes Projekt: Ermitteln des Titels eines YouTube-Videos mit einer gegebenen URL (Rechsklick auf einen Link)
      Spoiler anzeigen
      Schritt 1: Änderungen in der Registry
      Folgende Dinge habe ich geändert:
      "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\YouTube-Titel ermittlen" erstellt.
      SZ"(Standart)" auf "%APPDATA%\Microsoft\Internet Explorer\custom_extensions\get_yt_title.htm" gesetzt.
      DWORD"Contexts" erstellt und auf 0x20 gesetzt.

      Schritt 2: Der Javascript-Code
      Dann habe ich die Datei "%APPDATA%\Microsoft\Internet Explorer\custom_extensions\get_yt_title.htm" erstellt, mit folgendem Inhalt:

      HTML-Quellcode

      1. <script language="JavaScript">
      2. //Document etc ermitteln
      3. var parentwin = external.menuArguments;
      4. var doc = parentwin.document;
      5. //Geklickten Link ermitteln
      6. var x = parentwin.event.clientX, y = parentwin.event.clientY;
      7. el = doc.elementFromPoint(x, y).getAttribute("href");
      8. //Link erweitern falls nötig
      9. if (el.indexOf('/watch') == 0){
      10. el = 'http://www.youtube.com'+el;
      11. }
      12. if (el.indexOf('www') == 0){
      13. el = 'http://'+el;
      14. }
      15. //Prüfen ob der Link ein Youtube-Link ist
      16. var mat = el.match(/http(|s):\/\/(www.|)youtube.(com|de)\/watch(\?v=|\/)/gi);
      17. if(mat){
      18. if(mat.length != 0){
      19. //XMLHttpRequest an Youtube schicken und Antwort abholen
      20. var xmlhttp = new XMLHttpRequest();
      21. xmlhttp.open("GET", el, false);
      22. xmlhttp.send();
      23. var xmltxt=xmlhttp.responseText;
      24. //Titel extrahieren
      25. var title = xmltxt.substring(xmltxt.indexOf('<h1 id="watch-headline-title">'));
      26. title = title.substring(0, title.indexOf('</h1>'));
      27. title = title.substring(title.indexOf('<span'));
      28. var title = title.replace(/<(|\/)span.*>/gi,'');
      29. var title = title.replace(/(\r\n|\n|\r)/gm, '');
      30. title = title.replace(/^\s+|\s+$/g, '');
      31. //Ausgeben
      32. alert("Der Youtube-Titel zu diesen Link ist:\n\n"+title);
      33. }else{alert("Das ist kein YouTube-Videolink!");}
      34. }else{alert("Das ist kein YouTube-Videolink!");}
      35. </script>

      Der Code ermittelt zunächst die Video-URL, prüft diese, schickt dann ein Request an Youtube und parst aus diesem den Titel heraus.
      youtube.com/watch?v=0H1eKVbOW5U: mit einem Rechtsklick auf den Link und einen Klick auf "YouTube-Titel ermitteln" wird angezeigt:
      Der Youtube-Titel zu diesen Link ist:
      Die Fantastischen Vier - Lass die Sonne rein




      Fazit: Ich hoffe dieses Tutorial hilft dem einem oder anderem, den IE nach seinen Geschamack ein bisschen umzustylen, zu "hacken" :D und das sehr einfach nur mit Javascript.
      Ich freue mich natürlich über konstruktive Kritik und Verbesserungsvorschläge.
      SᴛᴀʀGᴀᴛᴇ01

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StarGate01“ ()