最近在將應(yīng)用程序從Windows Mobile遷移到Windows CE平臺(tái)的時(shí)候遇到了一個(gè)開(kāi)關(guān)無(wú)線網(wǎng)絡(luò)的問(wèn)題,經(jīng)過(guò)自己的一番摸索找到了一個(gè)通用的解決辦法,以下是詳細(xì)的原理及過(guò)程,
一、Windows Mobile下是怎么開(kāi)關(guān)無(wú)線的
其實(shí)開(kāi)關(guān)無(wú)線離不開(kāi)下面三個(gè)函數(shù),
[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參數(shù)到底應(yīng)該寫(xiě)什么呢?經(jīng)過(guò)Google老師的指引,我終于搞清楚了pvDevice的格式,
pvDevice = 設(shè)備類(lèi)型GUID\設(shè)備名稱
那無(wú)線設(shè)備類(lèi)型GUID到底改寫(xiě)什么呢,如果你你不介意Hard Code那你可以直接在你的代碼中寫(xiě){98C5250D-C29A-4985-AE5F-AFE5367E5006},如果你想在你的代碼中避免Hard Code那寫(xiě)一個(gè)讀注冊(cè)表函數(shù),去讀\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power\State\Suspend\下的第一個(gè)子鍵就可以了。
設(shè)備名稱怎么取呢?那當(dāng)然還得讀組冊(cè)表,下面的SDIO86861就是我們要的設(shè)備名稱。

1,判斷當(dāng)前無(wú)線狀態(tài)
GetDevicePower(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SDIO86861",1,ref dps)
檢查dps是否為D0.
2,打開(kāi)無(wú)線及關(guān)閉無(wú)線
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的方式控制無(wú)線
因?yàn)閃indows CE的注冊(cè)表中State下面是沒(méi)有值的,所以只能想辦法到其他地方去取了 :(
三、Windows CE下我們改怎么做
我的Device是M8,內(nèi)核是Windows CE6.0. 先看看MeiZu的注冊(cè)表項(xiàng)吧

果然State下面什么值都沒(méi)有! :(
之后郁悶了半天,又翻了半天的遠(yuǎn)程注冊(cè)表,終于被我發(fā)現(xiàn)一個(gè)可疑的注冊(cè)表鍵[Mobile Device\HKEY_LOCAL_MACHINE\Comm\SWLD24SP1],這個(gè)子鍵的結(jié)構(gòu)如下,

夠可疑的吧,趕緊用代碼試試先!
GetDevicePower(@"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\SWLD24SP1",1,ref dps),得到的dps為DevicePowerStateEnum.D0. 成功了!!
之后在Mobile設(shè)備上驗(yàn)證這個(gè)方法,結(jié)果也通過(guò)了.