Suchmaschinen ansprechen per Makro

Veröffentlicht: 14. Nov 2005

Von Mathias Schiffer

Mit Hilfe eines einfachen Makros können Sie direkt aus Visual Studio .NET heraus Internetrecherchen anstellen. Dieser MSDN Quickie zeigt, wie das funktioniert.

Im MSDN Quickie "Suchmaschinen aus Visual Studio .NET heraus ansprechen" wurde das Visual Studio .NET-PowerToy "VSOnlineSearch" vorgestellt, mit dem Sie über eine Erweiterung des Kontextmenüs von Codefenstern Suchmaschinen befragen können. Dieser Artikel folgt dem gleichen Ziel mit einem anderen Ansatz: Diesmal soll die Ansprache einer definierten Lieblings-Suchmaschine über ein Makro für Visual Studio .NET erfolgen. Diesem kann für den Aufruf einfach eine Tastenkombination zugewiesen werden. Außerdem zeigt dieses Beispiel, wie einfach Sie mithilfe von Makros Ihre Entwicklungsumgebung noch besser auf Ihren persönlichen Bedarf zuschneiden können.

Zunächst jedoch ist eine kleine Vorarbeit notwendig. Um den Internet Explorer als Fenster innerhalb der Entwicklungsumgebung einsetzen zu können, muss dieser über sein Objektmodell angesprochen werden. Dieses jedoch liegt bisher nur als COM-Komponente vor (ShDocVw.dll im Systemverzeichnis). Eine .NET-Kapselung dieser Bibliothek erhalten Sie über das Visual Studio .NET Command Prompt mithilfe des Kommandozeilentools tlbimp:

tlbimp "%SYSTEMROOT%\System32\ShDocVw.dll" /out:"%VSINSTALLDIR%\PublicAssemblies\Interop.ShDocVw.dll"

Dabei stehen die verwendeten Umgebungsvariablen in den Quell- und Zielpfaden für das Windowsverzeichnis (%SYSTEMROOT%) sowie für das Installationsverzeichnis von Visual Studio .NET (%VSINSTALLDIR%).

Rufen Sie anschließend die Makro-Entwicklungsumgebung von Visual Studio .NET auf. Sie erreichen diese über das "Extras"-Menü, indem Sie aus dem Untermenü "Makros" den Menüpunkt "Makro-IDE" auswählen oder über die Tastenkombination Alt+F11. Möchten Sie ein neues Makroprojekt anlegen, so spart Ihnen der Menüeintrag "Neues Makroprojekt" hingegen einige Klicks. Verwenden Sie daher diesen Menüpunkt, um Ihr Makroprojekt neu zu erzeugen und einen Speicherort dafür festzulegen. Über den eingeblendeten Makro-Explorer können Sie nun in die Makro-Entwicklungsumgebung wechseln.

Fügen Sie dort bitte zuerst Ihrem neuen Makroprojekt eine Referenz auf die soeben erzeugte .NET-Bibliothek Interop.ShDocVw sowie auf System.Web.dll hinzu, um aus Ihrem Makro heraus das Internet Explorer-Objektmodell ansprechen zu können. Anschließend steht der Makroerstellung selber nichts mehr im Wege. Der Code dafür ist überschaubar: Er ermittelt den derzeit markierten Text im aktiven Codefenster der IDE, baut diesen URL-codiert als Suchbegriff in einen Suchmaschinen-URL ein und verwendet schließlich für die Anzeige des Suchergebnisses ein WebBrowser-Fenster der IDE, das mithilfe der WebBrowser-Schnittstelle angesprochen wird.

Option Explicit On
Option Strict On
  
Imports EnvDTE
Imports System.Diagnostics
  
  
Public Module Module1
    ' Ändern Sie Modulnamen eines Makroprojekts nie im Sourcecode, sondern
    ' im Projektexplorer-Fenster. Andernfalls werden die Makros nicht in
    ' Visual Studio .NET erkannt.
  
    Sub WebSearch()
        ' Führt eine konfigurierbare Websuche durch, wobei der
        ' aktuell markierte Text im Codefenster von VS .NET
        ' als Suchbegriff verwendet wird. Die verwendete Suchmaschine
        ' lässt sich über die Konstanten strBaseUrl und strFindUrl
        ' konfigurieren.
  
        ' Konfigurierbare String-Konstante:
        ' Aufruf der Suchmaschine ohne Parameter:
        Const strBaseUrl As String = "http://www.google.de"
        ' Aufruf der Suchmaschine mit Suchtext "{0}"
        Const strFindUrl As String = "http://www.google.de/search?q={0}"
  
        Dim strUrl As String = strBaseUrl
        Dim strText As String
  
        Try
  
            ' Markierten Text aus dem aktuellen Codefenster ermitteln
            Dim selText As TextSelection _
                        = CType(DTE.ActiveDocument.Selection, TextSelection)
            strText = selText.Text.Trim()
  
            ' Ermittelten Text als Suchbegriff einfügen (URL-codiert)
            strUrl = String.Format(strFindUrl, _
                                   System.Web.HttpUtility.UrlEncode(strText))
  
        Catch ex As System.Exception
  
            ' Ohne verwertbaren Text wird die Suchmaschine parameterlos
            ' aufgerufen (Standardwert: strUrl = strBaseUrl).
  
        End Try
  
        ' Webbrowser-Fenster der IDE ermitteln und als WebBrowser-Objekt ansprechen
        Dim ideWindow As Window _
                      = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindWebBrowser)
        ' Fenster sichtbar schalten
        ideWindow.Visible = True
  
        ' Suchanfrage per WebBrowser-Interface absetzen:
        Try
  
            Dim webBrowser As Interop.ShDocVw.WebBrowser _
                           = CType(ideWindow.Object, Interop.ShDocVw.WebBrowser)
            webBrowser.Navigate(strUrl)
  
        Catch ex As System.Exception
  
            MsgBox(ex.Message, MsgBoxStyle.Critical)
  
        End Try
  
    End Sub
  
  
End Module

Schließlich verbleibt noch die Aufgabe, dieses Makro mit einem Tastaturkürzel zu verknüpfen, damit man es von Visual Studio .NET aus aufrufen kann. Dies erreichen Sie über den Optionsdialog, den Sie über das "Extras"-Menü erreichen: Unter "Umgebung" finden Sie im Optionsbaum den Dialog "Tastatur", mit dessen Hilfe Sie Ihr soeben erzeugtes Makro auffinden können, um daraufhin eine Tastenkombination zur Nutzung aus der Entwicklungsumgebung heraus zu definieren.

Zum Abschluss noch ein Tastenkürzel
Abbildung 1: Zum Abschluss noch ein Tastenkürzel

Mehr Informationen zur Funktionalität des Tastatur-Optionenfensters finden Sie auch im MSDN Quickie "Tastenkombinationen in VS.NET verwenden und zuweisen".

Mathias Schiffer widmet sich als freier Technologievermittler und Entwickler großen Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen und seine Erfahrungen in unzähligen Publikationen und Beratungen auch an andere Entwickler und Entscheider weiter. Sie erreichen Mathias Schiffer per E-Mail an die Adresse Schiffer@mvps.org.