首页
社区
课程
招聘
[原创]发个WM手机开关GSM模块的代码(即飞行模式开关)
发表于: 2009-4-30 11:52 15133

[原创]发个WM手机开关GSM模块的代码(即飞行模式开关)

2009-4-30 11:52
15133

哎,真不知道怎么一个两个都把它藏着掖着,查了半天资料以及IDA逆了来电精灵和一个一键飞行工具才明白了其中的内幕。

成品界面看附件图。

不多说了,用法是:
SetPhoneState(LINEEQUIPSTATE_MINIMUM); //开飞机
SetPhoneState(LINEEQUIPSTATE_FULL);   //安全着陆

------------------------------------------------------------------------------------

DWORD GetTSPLineDeviceID(const HLINEAPP hLineApp, const DWORD dwNumberDevices, const DWORD dwAPIVersionLow, const DWORD dwAPIVersionHigh, const TCHAR* const psTSPLineName)
{
DWORD dwReturn = 0xffffffff;
for(DWORD dwCurrentDevID = 0 ; dwCurrentDevID < dwNumberDevices ; dwCurrentDevID++)
{
   DWORD dwAPIVersion;
   LINEEXTENSIONID LineExtensionID;
   if(0 == lineNegotiateAPIVersion(hLineApp, dwCurrentDevID,
    dwAPIVersionLow, dwAPIVersionHigh,
    &dwAPIVersion, &LineExtensionID))
   {
    LINEDEVCAPS LineDevCaps;
    LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
    if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
     dwAPIVersion, 0, &LineDevCaps))
    {
     BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
     if(0 != pLineDevCapsBytes)
     {
      LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
      pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
      if(0 == lineGetDevCaps(hLineApp, dwCurrentDevID,
       dwAPIVersion, 0, pLineDevCaps))
      {
       if(0 == _tcscmp((TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset),
        psTSPLineName))
       {
        dwReturn = dwCurrentDevID;
       }
      }
      delete[] pLineDevCapsBytes;
     }
    }
   }
}
return dwReturn;
}

DWORD SetPhoneState(DWORD state)
{
HLINEAPP m_hLineApp = 0;
DWORD m_dwAPIVersion = TAPI_API_HIGH_VERSION;
DWORD dwNumDevs;
LINEINITIALIZEEXPARAMS liep;
liep.dwTotalSize = sizeof(liep);
liep.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
HLINE hLine = 0;
LONG lRC = 0;
DWORD dwState, dwRadioSupport;
TCHAR gszFriendlyAppName[160];

if(lineInitializeEx(&m_hLineApp, 0, 0, gszFriendlyAppName, &dwNumDevs, &m_dwAPIVersion, &liep)) {
   return PHONEDEVICE_ERROR;
}

if(NULL == m_hLineApp)
{
   return -1;
}

DWORD dwDeviceID = GetTSPLineDeviceID(m_hLineApp, dwNumDevs, TAPI_API_LOW_VERSION, TAPI_API_HIGH_VERSION, CELLTSP_LINENAME_STRING);

lRC = lineOpen( m_hLineApp, dwDeviceID, &hLine, m_dwAPIVersion, 0,
   NULL, LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM,
   NULL);

if(lRC < 0)
{
   if(hLine != NULL)
   {
    lineClose(hLine);
    hLine = NULL;
   }

   return lRC;
}

//lRC = lineGetEquipmentState(hLine, &dwState, &dwRadioSupport);

//if(lRC < 0)
//{
// lineClose(hLine);
// return lRC;
//}

//if((LINEEQUIPSTATE_MINIMUM == state) ||
// (LINEEQUIPSTATE_NOTXRX == state))
//{
// lRC = lineUnregister(hLine);

// if(lRC < 0)
// {
//   lineClose(hLine);
//   return lRC;
// }
//}

//if(dwState != state)
//{
   lRC = lineSetEquipmentState(hLine, state);
//}

if(lRC < 0)
{
   lineClose(hLine);
   return lRC;
}

if((LINEEQUIPSTATE_FULL == state) ||
   (LINEEQUIPSTATE_RXONLY == state) ||
   (LINEEQUIPSTATE_TXONLY == state))
{
   lRC = lineRegister(hLine, LINEREGMODE_AUTOMATIC, NULL, LINEOPFORMAT_NONE);

   if(lRC < 0)
   {
    lineClose(hLine);
    return lRC;
   }
}

lRC = lineClose(hLine);

return lRC;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
2
感谢小金的无私奉献!

正准备做这方面的实验,正好可以试试了。
2009-4-30 14:39
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
3
另外建议小金把整个工程作为压缩包挂上来。方便大家构建、学习。

因为对于不熟悉WM系统的朋友,无法知道应该包含哪些头文件和库。
2009-4-30 14:55
0
雪    币: 164
活跃值: (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
引用库是CellCore.lib
-------------------------------------
#include <windows.h>
#include <commctrl.h>
#include <tapi.h>
#include <tsp.h>
#include <extapi.h>

#define TAPI_API_LOW_VERSION                0x00020000
#define TAPI_API_HIGH_VERSION                0x00020000
#define EXT_API_LOW_VERSION                        0x00010000
#define EXT_API_HIGH_VERSION                0x00010000

#define PHONEDEVICE_ERROR                        0x00000000
#define PHONEDEVICE_ERROR_SUCCESS                0x00000001
#define PHONEDEVICE_ERROR_LINEOPEN                0x00000002
#define PHONEDEVICE_ERROR_LINECLOSE                0x00000004
#define PHONEDEVICE_ERROR_GETSTATE                0x00000008
#define PHONEDEVICE_ERROR_SETSTATE                0x00000010
#define PHONEDEVICE_ERROR_UNREGISTER                0x00000020
#define PHONEDEVICE_ERROR_REGISTER                0x00000040
2009-4-30 21:30
0
雪    币: 164
活跃值: (10)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
TAPI标准里应该是先用lineUnregister注销网络然后再lineSetEquipmentState关闭GSM,但是注销网络这一步会导致程序停止响应一会儿(因为lineUnregister要等待返回,除非用多线程去做),同时由于要注销网络,会稍慢一些,而国内其他飞行功能软件都是跳过这一步直接关GSM的,大概现在的GSM通讯升级了吧,关闭前系统会自动通知基站电话关闭的,所以去掉了lineUnregister这步,达到迅速关闭GSM的目的。
2009-5-1 10:32
0
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
6
呵呵。感谢小金的介绍啊。
2009-5-3 19:30
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
就2个好友一唱一和,没人支持吗?不错的代码
2009-8-28 11:59
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢小金的介绍啊。
2009-8-29 23:12
0
雪    币: 38
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
貌似有个著名的自动飞行的软件,挺不错的,和计划任务有机结合了。不错。建议LZ看下。
2009-8-30 17:45
0
雪    币: 244
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
支持小金的共享:)
2009-9-1 00:25
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢楼主提供!
2009-9-22 20:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习一下了,感谢分享
2011-3-23 21:35
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
楼主很强大,多谢分享
2011-3-26 10:37
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
留个脚印,以便后面的学习.
2011-12-5 10:59
0
游客
登录 | 注册 方可回帖
返回
//