最近在将应用程序从Windows Mobile迁移到Windows CE平台的时候遇到了一个开关无线网络的问题,经过自己的一番摸索找到了一个通用的解决办法,以下是详细的原理及过程,
一、Windows Mobile下是怎么开关无线的
其实开关无线离不开下面三个函数,
[DllImport("coredll.dll")]
protected static extern int GetDevicePower(string pvDevice, int Flags, ref DevicePowerStateEnum state);
[DllImport("coredll.dll")]
protected static extern int SetDevicePower(string pvDevice, int Flags, DevicePowerStateEnum state);
[DllImport("coredll.dll")]
protected static extern int DevicePowerNotify(string name, DevicePowerStateEnum state, int flags);
最头疼的是这边的pvDevice参数到底应该写什么呢?经过Google老师的指引,我终于搞清楚了pvDevice的格式,
pvDevice = 设备类型GUID\设备名称
那无线设备类型GUID到底改写什么呢,如果你你不介意Hard Code那你可以直接在你的代码中写{98C5250D-C29A-4985-AE5F-AFE5367E5006},如果你想在你的代码中避免Hard Code那写一个读注册表函数,去读\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\State\Suspend\下的第一个子键就可以了。
设备名称怎么取呢?那当然还得读组册表,下面的SDIO86861就是我们要的设备名称。
1,判断当前无线状态
GetDevicePower(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SDIO86861",1,ref dps)
检查dps是否为D0.
2,打开无线及关闭无线
DevicePowerNotify(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SDIO86861",DevicePowerStateEnum.D0,1);
Sleep(50);
SetDevicePower(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SDIO86861",1,DevicePowerStateEnum.D0);
二、Windows CE下为什么不能用Mobile的方式控制无线
因为Windows CE的注册表中State下面是没有值的,所以只能想办法到其他地方去取了 :(
三、Windows CE下我们改怎么做
我的Device是M8,内核是Windows CE6.0. 先看看MeiZu的注册表项吧
果然State下面什么值都没有! :(
之后郁闷了半天,又翻了半天的远程注册表,终于被我发现一个可疑的注册表键[Mobile Device\HKEY_LOCAL_MACHINE\Comm\SWLD24SP1],这个子键的结构如下,
够可疑的吧,赶紧用代码试试先!
GetDevicePower(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SWLD24SP1",1,ref dps),得到的dps为DevicePowerStateEnum.D0. 成功了!!
之后在Mobile设备上验证这个方法,结果也通过了.