Online- und Offline-Modus beim Internet Explorer setzen

Veröffentlicht: 25. Aug 2005

Von Mathias Schiffer

Die Microsoft Newsgroups sind eine Quelle schier unerschöpflichen Wissens, das nahezu auf Knopfdruck abrufbar ist: Hunderte deutschsprachige Entwickler vom Einsteiger bis zum Profi treffen sich hier täglich virtuell, um Fragen zu stellen oder zu beantworten. Auch themennahe Probleme, Ansichten und Konzepte werden miteinander diskutiert. Sie kennen die Microsoft Newsgroups noch nicht? Detaillierte Information für Ihre Teilnahme finden Sie auf der Homepage der Microsoft Support Newsgroups.

Diese Kolumne greift regelmäßig ein besonders interessantes oder häufig nachgefragtes Thema aus einer der Entwickler-Newsgroups auf und arbeitet es aus.

Aus der Visual Basic Newsgroup microsoft.public.de.vb:

Ich möchte den Microsoft Internet Explorer von meinem Programm aus in den Offline-Modus versetzen, um komplette Webseiten aus dem Cache anzuzeigen. Über die Offline-Eigenschaft des Objektmodells gelingt mir das jedoch nicht.

Die Offline-Eigenschaft des Internet Explorer-Objektmodells arbeitet tatsächlich nicht so, wie man es erwartet: Verwenden Sie im Menü "Datei" des Microsoft Internet Explorers den Menüpunkt "Offlinebetrieb", so wird der Offline-Status des gesamten Systems so gesetzt, dass auch alle anderen geöffneten Browserfenster automatisch im Offline-Modus sind. Sie erkennen dies daran, dass auch in allen anderen IE-Fenstern ein Häkchen neben dem betätigten Menüpunkt erscheint. Beim Verlassen des Offline-Modus lässt sich das gleiche Verhalten in umgekehrter Richtung beobachten.

Nichts davon jedoch passiert bei der Verwendung der Offline-Eigenschaft des Objektmodells des IE, auch das WebBrowser-Steuerelement kapselt mit seiner Offline-Eigenschaft keine andere Variante.

Sie können jedoch den Online-/Offline-Status des Systems über Funktionen des Win32-APIs auslesen und setzen. Dafür bedarf es nur eines geringen Mehraufwands.

Für unseren Zweck benötigen wir die Funktionen InternetSetOption und InternetQueryOption aus der Bibliothek WinInet.DLL, die diverse Internet-relevante Funktionalität für Windows vorhält. Mit ihrer Hilfe lassen sich entsprechende Optionen und Stati auslesen und setzen.

' Internet-Optionen setzen:
Private Declare Function InternetSetOption _
  Lib "wininet.dll" Alias "InternetSetOptionA" ( _
  ByVal hInternet As Long, _
  ByVal Options As Long, _
  ByRef lpBuffer As Any, _
  ByVal BufferLength As Long _
  ) As Long
  
' Internet-Optionen auslesen:
Private Declare Function InternetQueryOption _
  Lib "wininet.dll" Alias "InternetQueryOptionA" ( _
  ByVal hInternet As Long, _
  ByVal Options As Long, _
  ByRef lpBuffer As Long, _
  ByRef BufferLength As Long _
  ) As Long

Im Fall der Verbindungsoption benötigen wir zusätzlich die benutzerdefinierte Struktur INTERNET_CONNECTED_INFO für den Aufruf von InternetSetOption: Sie erhält die Information über den gewünschten Verbindungsstatus.

' Typ für lpBuffer in InternetSetOption
Private Type INTERNET_CONNECTED_INFO
  dwConnectedState As Long
  dwFlags As Long
End Type
  
' Benötigte API-Konstante
Private Const INTERNET_STATE_CONNECTED            As Long = &H1
Private Const INTERNET_STATE_DISCONNECTED_BY_USER As Long = &H10
Private Const INTERNET_OPTION_CONNECTED_STATE     As Long = &H32
Private Const ISO_FORCE_DISCONNECTED              As Long = &H1

Für das Setzen des Online-Modus wird der Parameter dwConnectedState der Struktur mit dem Wert INTERNET_STATE_CONNECTED belegt. Um eine Verbindung zu trennen, kann ihm der Wert INTERNET_STATE_DISCONNECTED_BY_USER zugewiesen werden. Durch Übergabe des Werts ISO_FORCE_DISCONNECTED kann das Trennen einer bestehenden Verbindung auch gegen den "Willen" einer anderen Anwendung erzwungen werden.

Etwas einfacher sieht die Sache bei InternetQueryOption aus: Sie liefert den Verbindungsstatus einfach als Long-Wert zurück, bei bestehender Verbindung ist im Rückgabewert das Bit INTERNET_STATE_CONNECTED gesetzt.

Um die vielseitigen Funktionen InternetQueryOption und InternetSetOption über ihren konkreten Aufrufzweck zu informieren, wird in unserem Fall die Konstante INTERNET_OPTION_CONNECTED_STATE an den Parameter Options der beiden Funktionen übergeben. Damit ist klar, dass wir den Verbindungsstatus des Systems (Online oder Offline) angehen wollen.

Die obige benutzerdefinierte Struktur (und deren Länge in Bytes) sind für die Funktionsparameter lpBuffer und BufferLength vorgesehen, bei der Abfrage des Status kann hier einfach eine Long-Variable eingesetzt werden. Da der Parameter hInternet für unseren Zweck bedeutungslos ist, wird ihm daher einfach 0 übergeben.

So einfach können Sie also herausfinden, ob sich das System im Offline-Modus befindet:

' --------------------------------------------------------
  ' Offline-/Online-Status des Systems ermitteln:
  ' --------------------------------------------------------
  Dim lState As Long
  Dim blnOffline As Boolean
  
  Call InternetQueryOption(0, _
                           INTERNET_OPTION_CONNECTED_STATE, _
                           lState, _
                           Len(lState))
  
  ' Das System ist offline, wenn das Bit 
  ' INTERNET_STATE_CONNECTED nicht gesetzt ist:
  blnOffline = CBool((lState And INTERNET_STATE_CONNECTED) = 0)
  
  ' --------------------------------------------------------

Das Setzen des Online-/Offline-Status ist nicht viel komplizierter:

Dim ICI As INTERNET_CONNECTED_INFO
  
  ' --------------------------------------------------------
  ' Das System in den Offline-Modus versetzen:
  ' --------------------------------------------------------
  ' Flags für den erzwungenen Offline-Modus setzen
  ICI.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER
  ICI.dwFlags = ISO_FORCE_DISCONNECTED
  
  ' Festgelegten Zustand erwirken
  Call InternetSetOption(0, _
                         INTERNET_OPTION_CONNECTED_STATE, _
                         ICI, _
                         LenB(ICI))
  ' --------------------------------------------------------
  
  ' --------------------------------------------------------
  ' Das System in den Online-Modus versetzen:
  ' --------------------------------------------------------
  ' Flag für den Online-Modus setzen
  ICI.dwConnectedState = INTERNET_STATE_CONNECTED
  
  ' Festgelegten Zustand erwirken
  Call InternetSetOption(0, _
                         INTERNET_OPTION_CONNECTED_STATE, _
                         ICI, _
                         LenB(ICI))
  ' --------------------------------------------------------

Zum Abschluss fassen wir alle Informationen noch einmal in einem praktischen Modul zusammen, das Sie in Ihre Anwendungen einbauen können: Damit reduziert sich Ihr Aufwand auf den Aufruf der zur Verfügung gestellten Funktionen IeGetOfflineMode und IeSetOfflineMode.

Option Explicit

' Typ für lpBuffer in InternetSetOption
Private Type INTERNET_CONNECTED_INFO
  dwConnectedState As Long
  dwFlags As Long
End Type

' Benötigte API-Konstante
Private Const INTERNET_STATE_CONNECTED            As Long = &H1
Private Const INTERNET_STATE_DISCONNECTED_BY_USER As Long = &H10
Private Const INTERNET_OPTION_CONNECTED_STATE     As Long = &H32
Private Const ISO_FORCE_DISCONNECTED              As Long = &H1

' Internet-Optionen setzen:
Private Declare Function InternetSetOption _
  Lib "wininet.dll" Alias "InternetSetOptionA" ( _
  ByVal hInternet As Long, _
  ByVal Options As Long, _
  ByRef lpBuffer As Any, _
  ByVal BufferLength As Long _
  ) As Long

' Internet-Optionen auslesen:
Private Declare Function InternetQueryOption _
  Lib "wininet.dll" Alias "InternetQueryOptionA" ( _
  ByVal hInternet As Long, _
  ByVal Options As Long, _
  ByRef lpBuffer As Long, _
  ByRef BufferLength As Long _
  ) As Long


Public Function IeGetOfflineMode() As Boolean
' Fragt ab, ob sich das System momentan im Offline-Modus
' befindet (True) oder nicht (False).
Dim lState As Long

  ' InternetQueryOption aufrufen
  Call InternetQueryOption(0, _
                           INTERNET_OPTION_CONNECTED_STATE, _
                           lState, _
                           Len(lState))

  ' Gesetztes Bit INTERNET_STATE_CONNECTED auswerten
  IeGetOfflineMode = CBool((lState And INTERNET_STATE_CONNECTED) = 0)
  
End Function


Public Sub IeSetOfflineMode(ByVal Offline As Boolean, _
                            Optional ByVal Force As Boolean = True)
' Legt den Online-/Offline-Status des Systems fest.
Dim ICI As INTERNET_CONNECTED_INFO

  ' Offline-/Online-Flags setzen
  If Offline Then
    ' Flag für den Offline-Modus setzen
    ICI.dwConnectedState = INTERNET_STATE_DISCONNECTED_BY_USER
    If Force Then ICI.dwFlags = ISO_FORCE_DISCONNECTED
  Else
    ' Flag für den Online-Modus setzen
    ICI.dwConnectedState = INTERNET_STATE_CONNECTED
  End If

  ' Festgelegten Zustand erwirken
  Call InternetSetOption(0, _
                         INTERNET_OPTION_CONNECTED_STATE, _
                         ICI, _
                         LenB(ICI))

End Sub

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