Windows Forms Call WinRT

Vor längerer Zeit hat Holger Schwichtenberg schon einmal das Thema aufgegriffen und gestern Scott Hanselman in seinem Blog. Wie kann man Funktionen von Windows 8 in Windows Forms (oder WPF etc.) nutzen. Ganz konkret API calls aus WInRT. Das ist eigentlich von Microsoft nicht vorgesehen und deshalb mit Vorsicht zu genießen.

In diesem VB.NET Beispiel wird der Lichtsensor angesprochen. Das kann man seit Windows 7 über die location und Sensor API tun. Es gibt sogar eine passende Erweiterung für Silverlight die native Extensions.

Trotz all dem soll die Einbindung von Winrt in Windows Forms mit Visual Basic demonstriert werden. Um eine Referenz erstellen zu können muss in vbproj File eine Ergänzung vorgenommen werden.

  <PropertyGroup>
   ...
    <TargetPlatformVersion>8.0</TargetPlatformVersion>
  </PropertyGroup>

Wenn man nun den Lichtsensor anspricht, weist einen Visual Studio Intellisense darauf hin, das die Referenzen fehlen.

image

Es muss natürlich noch die Reference auf die WinRT API erstellt werden.

image

Nun kann ein Objekt für das Sensor Handling instanziiert werden.

Public Class Form1
    Dim light As LightSensor = LightSensor.GetDefault()

Als nächstes wird auf die Änderungen des Sensors reagiert und das passende Event registriert.

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        If light IsNot Nothing Then
            Dim minReportInterval As UInteger = light.MinimumReportInterval
            Dim reportInterval As UInteger = If(minReportInterval > 16, minReportInterval, 16)
            light.ReportInterval = reportInterval
            AddHandler light.ReadingChanged, AddressOf licht
        End If

 End Sub

Nun kann man zur Ausgabe der Daten im UI schreiten. Da WinRT typisch die Helligkeitswerte nicht im UI Thread kommen, per Invoke die Daten mit der UI synchronisiert. Die Klasse Dispatcher ist in Winforms nicht vorhanden.

Private Sub licht(sender As Object, e As LightSensorReadingChangedEventArgs)
     Me.Invoke(Sub() Label1.Text = e.Reading.IlluminanceInLux)
End Sub
Kommentare sind geschlossen