.NET CF 应用程序开发指南

在移动设备软件开发领域,.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); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485