[C/C++源码]M8新UI下切换飞行模式

在旧UI中用SetFlyMode()这个SDK提供的API就可以.但是在新UI中,魅族一直没有实现SetFlyMode()这个函数,所以我们需要自己来实现,主要是实现电话开关.

Dial_SetEquipmentState()用这个未公开API就可以实现电话开关.它在PhoneAdapter.lib中定义连接,最终由PhoneAdapter.dll实现.
可以使用Dial_SetEquipmentState()来独立开关电话,但是由于固件问题,关闭电话后重启电话会自动开启(貌似注册表中没有像飞行模式那样的键值,以致无法判断开关状态,所以开机会自动打开电话,而开启飞行模式后不会自动打开).

以下这段代码可以稳定地用于MyMobile(WinCE)切换飞行模式,和系统设置/系统备份程序等实现飞行模式切换都是一致的.

 

#include <WlanEnableApi.h>
#include <SettingApi.h>
#include <CallNotifyApi.h>
CALL_DLLPORT_GPRS BOOL Dial_SetEquipmentState(HWND hMainWnd,DWORD dwstate);  //定义这个未公开API

#pragma comment(lib,"PlatformApi.lib")
#pragma comment(lib,"PhoneAdapter.lib")

//用于0960以上SDK,来源于 管它(ScheduleTask)

//用到的修改注册表的函数
bool RegWriteDWORD(IN HKEY const hKeyName,IN LPCTSTR lpSubKey,IN LPCTSTR lpValueName,IN DWORD const dwValueIN,bool bCreateKey=false);

//设置飞行模式的状态,成功返回true,失败返回false; hWnd为窗口句柄,不用时置为NULL; bFlyMode为true时,设置为飞行模式,为false时,设置为正常模式.
bool STSetFlightMode(HWND hWnd, bool bFlightMode)
{
        if (bFlightMode)
        {
                //设置为飞行模式

                if (Dial_SetEquipmentState(hWnd, EQSTATE_DISABLETXANDRX) != RESULT_OK) //关闭电话
                {
                        return false;
                }

                EnableMzwlan(false);
                RegWriteDWORD(HKEY_CURRENT_USER,L"Software\\MZwlan\\",L"wlansetting",0);  //修改注册表值,关闭WLAN.防止飞行后设置中WLAN状态还是开启

                SwitchBTPower(FALSE);
                SetFlyModeReg(true);  //修改飞行状态到注册表
                FlyModeSendMsgToShell(true);  //通知shell显示飞行状态
        }
        else
        {
                //正常模式
                SetFlyModeReg(false);
                FlyModeSendMsgToShell(false);

                if (Dial_SetEquipmentState(hWnd, EQSTATE_FULL) != RESULT_OK) //打开电话
                {
                        SetFlyModeReg(true);
                        FlyModeSendMsgToShell(true);

                        return false;
                }
        }

        return true;
}

bool RegWriteDWORD(IN HKEY const hKeyName,IN LPCTSTR lpSubKey,IN LPCTSTR lpValueName,IN DWORD const dwValue,IN bool bCreateKey)
{
        HKEY        hKey = NULL;
        LONG lRet=0;
        if (bCreateKey)
        {
                DWORD        dwDisposition = 0;                //REG_CreateD_NEW_KEY, REG_OPENED_EXISTING_KEY
                lRet=::RegCreateKeyEx(hKeyName, lpSubKey, 0, NULL,REG_OPTION_NON_VOLATILE ,0 , NULL, &hKey, &dwDisposition);
        }
        else
        {
                lRet=::RegOpenKeyEx(hKeyName,lpSubKey, 0, NULL,&hKey);
        }
        if (ERROR_SUCCESS==lRet)
        {
                ::RegSetValueEx(hKey,lpValueName, 0, REG_DWORD,(BYTE *)&dwValue, sizeof(dwValue));        
                ::RegCloseKey(hKey);
                return true;
        }
        return false;
}



[本日志由 LOJA 于 2010-02-21 06:20 PM 编辑]
上一篇: 《阿凡达》背后的意识境界
下一篇: [M8新软预告]待机助手(LittleAssistant)桌面插件版
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: M8 MyMobile C C++ 源码 飞行模式 FlightMode
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 800 字 | UBB代码 开启 | [img]标签 开启