missautumn's BLOG

devote to innovation of technique

Windows CE下开关无线的通用办法

最近在将应用程序从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设备上验证这个方法,结果也通过了.

posted on 2009-07-14 17:27 william 阅读(3152) 评论(8)  编辑 收藏 引用 所属分类: C++Windows Mobile Development

Feedback

# re: Windows CE下开关无线的通用办法 2009-07-14 20:58 乐蜂网

好东西!谢谢  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2009-07-15 11:50 99读书人

不错 哦  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2009-07-16 18:59 99网上书城

分享好东西  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2010-04-13 11:34 阿道夫

即使改了作者的网卡SWLD24SP1,这个方法试了行不通,还不能说是通用的  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2010-04-15 13:48 阿道夫

试了很多次,在CE5.0上通不过,我的也是SDIO86861的网卡  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2010-04-15 13:51 阿道夫

Mobile5.0上也不行的,使用WLP1:作为设备名称可以通过  回复  更多评论   

# re: Windows CE下开关无线的通用办法 2010-11-19 12:25 SDIO86861

@阿道夫
那你现在搞定没? 我也是这个网卡  回复  更多评论   

# re: Windows CE下开关无线的通用办法[未登录] 2011-02-24 13:48 riverqh

先使用WZCEnumInterfaces获取无线网卡列表(一般PDA也就只有一个无线网卡吧,那就拿第一个好了),然后前面固定加上无线网卡MiniPort的GUID {98C5250D-C29A-4985-AE5F-AFE5367E5006}\作为设备名称传递到SetPower/GetPower就行了。  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理