重启 Windows Mobile 设备
如何在应用程序中重启 Windows Mobile 设备。
引言
如何在应用程序中重启 Windows Mobile 设备。今天,我们使用 Visual Studio 2008 实现此功能。
背景
开发 .NET CF 应用程序时,经常会遇到这个问题。
使用代码
打开 Visual Studio 2008,选择“文件”菜单,“新建” - “项目”。我们会看到“新建项目”对话框。
在项目类型中,我们选择 Visual Basic Smart Device 项目。(也可以选择 Visual C# Smart Device 项目)。
在 Smart Device 对话框中,我们选择目标平台为“Windows Mobile 6 Professional SDK”,需要说明的是,Visual Studio 2008 中的 Windows Mobile 6 SDK 并非默认安装,因此需要单独安装。
然后选择 .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 代码片段中。
选择“插入代码片段”,会有一个列表,我们依次选择“智能设备” - “设备操作系统” - “重置设备”。
插入代码片段,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 设备 将会重启。
Visual C# 示例代码
[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); }
历史
在此处保持您所做的任何更改或改进的实时更新。