Entwicklung einer Browser-Toolbar: Microsoft Internet Explorer (3/5)

Diese Artikelserie ist die deutsche Übersetzung meines Artikels “Developing a Browser Toolbar”, der in den ASPects (Englisch) im Januar 2010 (Jahrgang 23, Ausgabe 1), ein Magazin der Association of Shareware Professionals (ASP; Englisch), veröffentlicht wurde.

Die erste zu treffende Entscheidung ist die Programmiersprache, welche Sie für die Entwiclung der Internet-Explorer-Toolbar verwenden möchten. Bei meinen Recherchen im Internet fand ich Beispiele für C++, Visual Basic 6 und .NET. Es scheint einige Visual-Style-Probleme zu geben, wodurch die Toolbar bei System mit Windows Vista und Windows 7 nicht sonderlich gut aussieht, wenn C++ verwendet wird. Und nachdem ich wirklich keine Lust hatte noch in Visual Basic 6 zu entwickeln, entschied ich mich für .NET. Der einzige Nachteil dieser Entscheidung war, dass der Benutzer das .NET Framework 2.0 (oder neuer) auf seinem System installiert haben muss. Damit kann ich jedoch leben, da es bereits sehr verbreitet ist.

Aufgrund dessen, dass fast alle meine Produkte in .NET entwickelt sind, hatte ich bereits Visual Studio 2008 auf meinem Computer installiert. Falls Sie das nicht haben, benötigen Sie zumindest die Express Edition (Version 2005 sollte auch ausreichen) für die nächsten Schritte. Ich entschied die Toolbar in C# zu entwickeln, aber mit Visual Basic .NET ginge das selbstverständlich auch.

Als ein guter Ausgangspunkt fand ich diesen (Englisch) und diesen (Englisch) Artikel auf der Code-Project-Webseite. Falls Sie mehr über die COM-Komponente wissen möchten, können Sie auch das C++-Tutorial (Englisch) lesen, aber das ist nicht unbedingt erforderlich. Unter Verwendung der Beispiel-Quelltexte dieser beiden Artikel, sollten Sie eine funktionierende Toolbar erhalten – zumindest auf einem Windows-XP-System. Jedoch stieß ich auf einige Probleme, die behoben werden mussten und die ich daher im Folgenden näher beschreiben werde:

Sicherstellen, dass die Toolbar auf sämtlichen Betriebssystemen korrekt angezeigt wird

Mit dem Demo-Quelltext der oben erwähnten Artikel habe ich die Toolbar ziemlich schnell auf meinem Windows-XP-Testrechner zum Laufen bekommen. Naiverweise ging ich davon aus, dass die Toolbar, die auf Windows XP mit Internet Explorer 8 korrekt funktioniert, auch auf Windows Vista und Windows 7 mit derselben Internet-Explorer-Version funktionieren würde. Aber tatsächlich musste ich lernen, dass dies absolut nicht der Fall ist! Sie wurde entweder überhaupt nicht dargestellt oder soweit auf der rechten Seite, dass man sie nur mit einer horizontalen Auflösung von mindestens 2.000 Pixel sehen konnte. Somit musste ich nach einer Lösung suchen, jedoch die meisten Quelltextänderungen führten nur dazu, dass die Toolbar entweder auf dem einen oder dem anderen Betriebssystem beziehungsweise der einen oder anderen Browserversion funktionierte. Nach einigen Stunden frustrierendem Testen, habe ich die GetBandInfo-Funktion der BandObjectsLib-Klasse wie folgt geändert. Obwohl ich nach wie vor nicht ganz sicher bin weswegen, so funktioniert es nun auf allen Betriebssysteme problemlos:

public virtual void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO dbi)
{
    if ((dbi.dwMask & DBIM.MINSIZE) != 0)
    {
        dbi.ptMinSize.X = this.MinimumSize.Width;
        dbi.ptMinSize.Y = this.MinimumSize.Height;
    }

    if ((dbi.dwMask & DBIM.MAXSIZE) != 0)
    {
        dbi.ptMaxSize.X = this.MaximumSize.Width;
        dbi.ptMaxSize.Y = this.MaximumSize.Height;
    }

    if ((dbi.dwMask & DBIM.ACTUAL) != 0)
    {
        dbi.ptActual.X = this.Size.Width;
        dbi.ptActual.Y = this.Size.Height;
    }

    if ((dbi.dwMask & DBIM.BKCOLOR) != 0)
    {
        dbi.dwMask &= ~DBIM.BKCOLOR;
    }

    dbi.dwModeFlags = DBIMF.BREAK;
}

Hübschere Darstellung auf Windows XP und neuer

Wenn Sie den folgenden Ereignis-Handler in der BandObjectsLib-Klasse nicht hinzufügen, wird Ihre Toolbar zwar dennoch funktionieren, aber einfach nicht sonderlich schön auf Windows XP und neuer aussehen. Die if-Anweisung in der Ereignisfunktion stellt dabei sicher, dass die Toolbar auch auf älteren Betriebssystemen wie Windows 98, 2000 und ME nach wie vor funktioniert. Ansonsten würde es zu einer Ausnahme auf diesen Betriebssystemen kommen. Hier ist der Quelltext, den ich verwendet habe, um es auf sämtliche Betriebssystem korrekt zum Laufen zu bringen:

[DllImport("uxtheme", ExactSpelling = true)]
public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc,
                                                     ref Rectangle pRect);

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (System.Environment.OSVersion.Platform >= PlatformID.Win32NT &&
           (Environment.OSVersion.Version.Major == 5 &&
            Environment.OSVersion.Version.Minor >= 1 ||
            Environment.OSVersion.Version.Major >= 6) &&
           this.BackColor == Color.Transparent)
    {
        // Only if operating system is Windows XP or higher
        IntPtr hdc = e.Graphics.GetHdc();
        Rectangle rec = new Rectangle(e.ClipRectangle.Left,
            e.ClipRectangle.Top, e.ClipRectangle.Width, e.ClipRectangle.Height);
        DrawThemeParentBackground(this.Handle, hdc, ref rec);
        e.Graphics.ReleaseHdc(hdc);
    }
    else
    {
        base.OnPaintBackground(e);
    }
}

Keine Serialisierung erlaubt

Bei der Entwicklung einer Firefox-Toolbar können Sie den Mozilla-Preferences-Dienst verwenden, um benutzerdefinierte Werte direkt innerhalb Firefox abzuspeichern und zu laden. Da es im Internet Explorer kein Gegenstück dazu gibt und ich XML-Serialisierung in vielen anderen .NET-Produkten verwende, wollte ich diese in dem Toolbar-Projekt ebenfalls verwenden. Auf den ersten Blick funktionierte das auch einwandfrei, aber wenn im Internet Explorer 8 der Protected Mode aktiviert ist (und das ist er standardmäßig, zumindest seit Windows Vista), bekommt der Benutzer ein hässliches Warnungsfenster jedes Mal angezeigt, wenn die Toolbar initialisiert wird. Den Grund dafür werde ich nun nicht im Detail erläutern; verwenden Sie einfach keine Serialisierung in Internet-Explorer-Toolbars. Sie können benutzerdefinierte Werte entweder ohne Serialisierung im Dateisystem unterhalb des lokalen Anwendungsdatenverzeichnisses abspeichern oder einfach die Registry verwenden.

Automatisches Online-Update

Wie in der Firefox-Version, wollte ich auch, dass die Internet-Explorer-Toolbar eine automatische Update-Funktion beinhaltet. Da es jedoch kein Update-System für Toolbars wie im Firefox gibt, musste ich ein eigenes implementieren. Dies ist jedoch relativ einfach, zumal man – wie auch in anderen .NET-Anwendungen – einfach die WebClient-Klasse verwenden kann, um zunächst eine HTTP-Anfrage zu machen, ob ein Update verfügbar ist, und um danach die Update-Datei herunterzuladen, falls erforderlich. Auf der Serverseite nutze ich eine kleines PHP-Skript, das sich um die Update-Anfrage kümmert. Die Update-Datei, die heruntergeladen wird, ist die normale Setup-Datei, welche einfach sämtliche Dateien mit neuen überschreibt. Das Einzige, auf was Sie achten müssen, ist die Art und Weise, wie Sie die ausführbare Setup-Datei nach dem Download aufrufen, da ansonsten ein Dialog der Benutzerkontensteuerung (UAC) angezeigt wird. Ich habe folgende Prozedur geschrieben, die Sie verwenden können, um eine Datei aus der Toolbar heraus auszuführen, ohne dass irgendeine Warnung dem Benutzer angezeigt wird:

private void startProcess(string fileName, string arguments)
{
    System.Diagnostics.ProcessStartInfo startInfo =
        new System.Diagnostics.ProcessStartInfo();
    startInfo.UseShellExecute = true;
    startInfo.WorkingDirectory = Environment.CurrentDirectory;
    startInfo.FileName = fileName;
    if (Environment.OSVersion.Platform >= PlatformID.Win32NT &&
            Environment.OSVersion.Version.Major >= 6)
        // Only if operating system is Windows Vista or higher
        startInfo.Verb = "runas";
    else
        startInfo.Verb = "open";
    startInfo.Arguments = arguments;
    startInfo.ErrorDialog = true;
    try
    {
        System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo);
        process.WaitForExit();

        MessageBox.Show(objToolbarData["msg.restartBrowserText"],
                        objToolbarData["msg.restartBrowserTitle"],
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        if (debugMode) MessageBox.Show(ex.ToString());
    }
}

Deinstallationsschaltfläche innerhalb der Toolbar

Das war das Einzige, was im Internet Explorer einfacher zu implementieren war als im Firefox; es muss lediglich das Deinstallationsprogramm (wieder mit der startProcess-Prozedur von oben) des Installationssystems (siehe nächster Post###) ausgeführt werden, um die Toolbar wieder zu deinstallieren. Nach einem Browser-Neustart wird sie dann nicht mehr angezeigt (wie auch beim Firefox).

Geschafft; die Internet-Explorer-Version von unserer Toolbar ist nun auch fertig! Sie wird mit Internet Explorer 6 oder neuer auf Windows 98 oder neuer mit installiertem .NET Framework 2.0 funktionieren.

Im nächsten Artikel werde ich erklären, wie die Toolbars installiert werden.

Inhalt der Artikelserie “Entwicklung einer Browser-Toolbar”:

Der Artikel ist auch in English verfügbar.

2 Gedanken zu “Entwicklung einer Browser-Toolbar: Microsoft Internet Explorer (3/5)

  1. Pingback: Entwicklung einer Browser-Toolbar: Mozilla Firefox (2/5) | AB-WebLog.com

  2. Pingback: Entwicklung einer Browser-Toolbar: Installationssystem (4/5) | AB-WebLog.com

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>