在移动设备软件开发领域,.NET Compact Framework (CF) 是一个重要的开发平台,它为开发者提供了在资源受限的设备上运行.NET应用程序的能力。本文将指导如何在Visual Studio 2008环境下创建一个.NET CF应用程序,并实现在Windows Mobile设备上重启设备的功能。
首先,打开Visual Studio 2008,选择“文件”菜单下的“新建” - “项目”。接下来,将看到一个“新建项目”对话框。在这个对话框中,需要选择“Visual Basic Smart Device”或“Visual C# Smart Device”项目类型。
在“Smart Device”对话框中,需要选择“Windows Mobile 6 Professional SDK”作为目标平台。需要注意的是,Windows Mobile 6 SDK并不是Visual Studio 2008的默认安装内容,因此可能需要单独安装它。然后,选择.NET CF的版本,这里选择.NET CF 3.5。需要说明的是,.NET CF并没有3.0版本,这是为了与.NET Framework保持一致性,在.NET CF 2.0之后就是.NET CF 3.5。
最后,选择创建“设备应用程序”。进入IDE编辑界面后,会发现IDE环境并没有太大变化。在菜单中直接增加了“重置”和“退出”两个菜单项。
双击“退出”菜单项,进入代码页面。在“MenuItem1_Click”函数外部,右键点击鼠标。在弹出的菜单中,选择“插入代码片段”。代码片段是Visual Studio中一个非常有用的功能,它允许保存一些有用的代码片段,在需要使用时不必到处查找预先编写的代码。想要使用的重启Windows Mobile设备的代码也在VB.NET的代码片段中。
选择“插入代码片段”,会出现一个列表,依次选择“Smart Devices” - “Device Operating System” - “Reset the Device”。插入代码片段后,将看到以下VB.NET代码。从代码中可以看到,该功能是通过调用KernelIoControl API函数实现的。KernelIoControl函数用于实现通用的IO控制,可以通过该函数实现许多功能,例如访问设备信息、文件系统和电源管理。
Private Declare Function KernelIoControl Lib "coredll.dll" _
(ByVal dwIoControlCode As Integer, ByVal lpInBuf As IntPtr, _
ByVal nInBufSize As Integer, ByVal lpOutBuf As IntPtr, _
ByVal nOutBufSize As Integer, ByRef lpBytesReturned As Integer) As Integer
Private Function CTL_CODE(ByVal DeviceType As Integer, ByVal Func As Integer, _
ByVal Method As Integer, ByVal Access As Integer) As Integer
Return (DeviceType << 16) Or (Access << 14) Or (Func << 2) Or Method
End Function
Private Function ResetPocketPC() As Integer
Const FILE_DEVICE_HAL As Integer = &H101
Const METHOD_BUFFERED As Integer = 0
Const FILE_ANY_ACCESS As Integer = 0
Dim bytesReturned As Integer = 0
Dim IOCTL_HAL_REBOOT As Integer
IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
Return KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, _
IntPtr.Zero, 0, bytesReturned)
End Function
在函数基础完成后,在菜单方法中调用ResetPocketPC方法。
Private Sub MenuItem1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MenuItem1.Click
ResetPocketPC()
End Sub
编译并运行程序后,程序的运行效果如上图所示。当点击“重置”菜单时,Windows Mobile设备将会重启。
[DllImport("coredll.dll")]
public static extern int KernelIoControl(int dwIoControlCode, IntPtr lpInBuf, int nInBufSize, _
IntPtr lpOutBuf, int nOutBufSize, ref int lpBytesReturned);
private int CTL_CODE(int DeviceType, int Func, int Method, int Access)
{
return (DeviceType << 16) | (Access << 14) | (Func << 2) | Method;
}
private int ResetPocketPC()
{
const int FILE_DEVICE_HAL = 0x101;
const int METHOD_BUFFERED = 0;
const int FILE_ANY_ACCESS = 0;
int bytesReturned = 0;
int IOCTL_HAL_REBOOT;
IOCTL_HAL_REBOOT = CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS);
return KernelIoControl(IOCTL_HAL_REBOOT, IntPtr.Zero, 0, IntPtr.Zero, 0, ref bytesReturned);
}