Monitoring Changes in System State
Windows Mobile 5.0 contains the SystemState (found in the Microsoft.WindowsMobile.Status assembly) class that provides the ability to get the current value of a system state as well as the ability to be notified when that state changes. For example, you might want to synchronize your Pocket PC with ActiveSync when the user connects the Pocket PC to the cradle (or synching cable). As such, your application needs to monitor if there is a change in the cradle state.
Figure 13 shows an application that displays the cradle state of the device as well as the IP address of itself and the host. Using such an application, you can write an application that synchronizes the content of the device with the desktop.
 | |
| Figure 13: Monitoring changes in system states. |
Let's look at the source code of the application. First, import the necessary namespaces. (This example requires you to add a reference to the Microsoft.WindowsMobile, Microsoft.WindowsCE.Forms, and Microsoft.WindowsMobile.Status assemblies.)
Imports Microsoft.WindowsMobile
Imports Microsoft.WindowsMobile.Status
Imports System.Net
Imports System.Text
Declare two SystemState variablesone to keep track of the cradle state, and one to keep track of the network connection state. Next, the code creates an instance of the Notification class to display notifications to the user.
Private WithEvents cradleState As SystemState
Private WithEvents networkConnectionState As SystemState
Private WithEvents notification1 As New Microsoft.WindowsCE. _
Forms.Notification
Declare the
DisplayGetOwnIPAddresses() subroutine to display the IP address(es) assigned to the Pocket PC.
'---display own IP address
Private Sub DisplayGetOwnIPAddresses()
lblIPAddresses.Text = String.Empty
Try
Dim ownAddr() As IPAddress = Dns.GetHostEntry( _
Dns.GetHostName()).AddressList
If ownAddr Is Nothing Then
Exit Sub
End If
For i As Integer = 0 To _
ownAddr.Length - 1
lblIPAddresses.Text &= ownAddr(i).ToString & vbCrLf
Next
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Declare the
DisplayHostIPAddresses() subroutine to display the IP address(es) of the host computer:
'---display host IP address
Private Sub DisplayHostIPAddresses()
lblHostIPAddress.Text = String.Empty
Try
Dim hostAddr() As IPAddress = Dns.GetHostEntry( _
"PPP_PEER").AddressList
If hostAddr Is Nothing Then
Exit Sub
End If
For i As Integer = 0 To _
hostAddr.Length - 1
lblHostIPAddress.Text = hostAddr(i).ToString
Next
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
When the form loads, you instantiate the cradleState and networkConnectionState objects (see
Listing 2) so that any changes in the cradle state or network connection state will trigger the necessary events (you will service them next).
When the IP address of the device changes (such as when it is connected to a Wi-Fi network and assigned a new IP address), the
Changed event of the networkConnectionState object will be fired. The new IP address of the device and the host PC will be updated.
'---event handler for handling changes
' in network connection state
Private Sub networkConnectionState_Changed( _
ByVal sender As Object, _
ByVal args As Microsoft.WindowsMobile.Status.ChangeEventArgs) _
Handles networkConnectionState.Changed
'---display own and host IP addresses
DisplayGetOwnIPAddresses()
DisplayHostIPAddresses()
End Sub
Likewise, when the cradle's state changes (when you connect or disconnect your Pocket PC from the host computer), the
Changed event of the cradleState object will fire (see
Listing 3). Here you will display a notification balloon to the user if the device is cradled to the computer. Notice that the content of the notification is coded in HTML. To dismiss a notification, you use the identifier
cmd:2 as the name for an input element. This identifier has special meaning in Windows CE and is used to dismiss notifications. The content of the notification allows the user to select the update frequency through a drop-down list box.
The code uses the
DisplayNotification() subroutine to display a notification balloon on the Pocket PC.
'---display the notification
Private Sub DisplayNotification( _
ByVal caption As String, _
ByVal text As String)
With notification1
.Caption = caption
.Text = text
.InitialDuration = 20
.Visible = True
End With
End Sub
When the user submits the information in a notification balloon, it fires the
ResponseSubmitted event via the
notification1 object variable. Here you'll add the logic to do whatever you are supposed to do, such as communicate with the host application to synchronize the content on the Pocket PC with the desktop.
Private Sub OnResponseSubmitted( _
ByVal sender As Object, _
ByVal args As Microsoft.WindowsCE.Forms. _
ResponseSubmittedEventArgs) _
Handles notification1.ResponseSubmitted
'---A sample reply---
' notify?lstIntervals=2
If (args.Response. Substring(0, 6) = "notify") Then
Dim choice As Integer = Convert.ToInt32( _
args.Response.Substring(20, 1))
Select Case choice
Case 0 '---do something
Case 1 '---do something
Case 2 '---do something
End Select
End If
notification1.Visible = False
End Sub
In this article, I've shown you some of the new features available on the Windows Mobile 5.0 platform. With Visual Studio 2005, developers using the .NET Compact Framework can now develop compelling applications with ease, as most of the important APIs are exposed as managed classes. If you have not started on mobile application development yet, now is a good time to get started!