Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 239, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

Wince及mobile常用代码(续)

一、怎样将已安装好的应用程序卸载:
用unload.exe,
szUninstallBuf这个参数必须和注册表 HLM\SOFTWARE\APPS\下的对应应用的名称一致。

有个前提,使用这个必须是在cab中没有指定 nouninstall这个参数

PROCESS_INFORMATION stProgressInfo;
if ( CreateProcess(_T("\\Windows\\unload.exe"), szUninstallBuf, NULL, NULL, NULL, 0, NULL, NULL, NULL, &stProgressInfo) )

二、屏蔽talk键(打电话的那个键):向窗口发送SHCMBM_OVERRIDEKEY消息,在WM_HOTKEY中进行处理。
参考SDK自带的Sample,位于“Windows Mobile 6 SDK\Samples\Common\CPP\Win32\FullScreen”目录。该例子演示了如何在Windows Mobile上隐藏taskbar和softkey,进行全屏显示。其中,退出全屏的功能,采用softkey按钮来实现。而具体的方式,就是向窗口发送SHCMBM_OVERRIDEKEY消息,在WM_HOTKEY中,加入用户自己的应用。以该工程为例,我们进行修改,加入“按Talk按键退出全屏”这个功能,而不弹出拨号界面。
1.在SetSoftkeyBarForFullScreen函数中,加入消息发送函数:

   // Override/Undo softkeys for key press notifications, so we can

   // display taskbar & softkeys on SK1/SK2 press in full screen.

    DWORD dwBits;

    dwBits = bFullScreen

                ? SHMBOF_NODEFAULT | SHMBOF_NOTIFY

                : 0;

    SendMessage(hwndSoftKeyBar,

                SHCMBM_OVERRIDEKEY,

                VK_TSOFT1,

                MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));

    SendMessage(hwndSoftKeyBar,

                SHCMBM_OVERRIDEKEY,

                VK_TSOFT2,

                MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));

    //加入的消息发送函数

     SendMessage(hwndSoftKeyBar,

                SHCMBM_OVERRIDEKEY,

                VK_TTALK,

                MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, dwBits));

 

2.在CALLBACK DialogProc(…)函数的WM_HOTKEY中,加入VK_TTALK键的处理:

   caseVK_TTALK:

        {

             // if we are in full screen mode we want to exit

             // when the user presses a softkey.

             if(g_bFullScreen)

             {   

                  SendMessage(GetDlgItem(hWnd,IDC_EDIT), WM_SETTEXT, 0, (LPARAM)L"[TALKkey] Exiting Full Screen");

                  FullScreen(hWnd, FALSE);

              }

          }

   break;
有关参考如下:

WM_HOTKEY:http://msdn.microsoft.com/en-us/library/aa453868.aspx

SHCMBM_OVERRIDEKEY:http://msdn.microsoft.com/en-us/library/aa454997.aspx

三、Windows Mobile上的无线网络接入点扫描:codeproject上有个Wifi AP扫描程序,称为:Wifi scanner + custom MFC controls。用它能够扫描当前的无线环境,发现周围的AP接入点,显示他们的名字、MAC地址、信号强度(RSSI)、Wifi信道以及是否需要密码等信息。
源码的运行设备是Pocket PC 2003se,要运行在window mobile平台,要在编译选项中Configuration Manger中选中wm设备,Active solution platform

选NEW,在弹出的窗口中,将new platform选择为windows mobile 的sdk,最后在Project->Properties中,选择Linker中的Command Line,在Additional Option中,将“machine:ARM”改为“machine:THUBM”。运行效果图如下:

Download demo project - 97.6 Kb
Download source - 90.8 Kb

四、短信相关的AT指令:
     AT+CMGC:发出一条短消息

    AT+CMGD:删除SIM卡内存的短消息

    AT+CMGF:选择短消息信息格式:0-PDU;1-文本

    AT+CMGL:列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,

                4/"ALL"-全部的

    AT+CMGR:读短消息

    AT+CMGS:发送短消息

    AT+CMGW :向SIM内存中写入待发的短消息

    AT+CMSS:从SIM卡内存中发送短消息

    AT+CNMI:显示新收到的短消息

    AT+CPMS:选择短消息内存

    AT+CSCA:短消息中心地址

    AT+CSCB :选择蜂窝广播消息

    AT+CSMP:设置短消息文本模式参数

    AT+CSMS:选择短消息服务
相关代码:
初始化短信模式设置的时候,可以使用:

//set AT+CMGF=1+回车换行

m_serialPort2.Write(new char[] { 'A', 'T', '+', 'C', 'M', 'G', 'F', '=', '1' }, 0, 9);

m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);

m_serialPort2.Write(new byte[] { 0x0A }, 0, 1);


短信内容发送完毕必须以十六进制数0x1A结束,例如,发送短信时,先发送对方号码,然后发送数据:

//发送text中输入的对方手机号码

stATCommand = "AT+CMGS=+86" + textBoxPhoneNumber.Text;

btATCommand = stATCommand.ToCharArray();

m_serialPort2.Write(btATCommand, 0, 22);

m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);

m_serialPort2.Write(new byte[] { 0x0A }, 0, 1);

Thread.Sleep(15);

m_serialPort2.Write(new char[] { 'H', 'e', 'l', 'l', 'o'}, 0, 5);

//set SMS end symbol

m_serialPort2.Write(new byte[] { 0x1A }, 0, 1);

 

//发送text中输入的对方手机号码

stATCommand = "AT+CMGS=+86" + textBoxPhoneNumber.Text;

btATCommand = stATCommand.ToCharArray();

m_serialPort2.Write(btATCommand, 0, 22);

m_serialPort2.Write(new byte[] { 0x0D }, 0, 1);

m_serialPort2.Write(new byte[] { 0x0A }, 0, 1);

Thread.Sleep(15);

m_serialPort2.Write(new char[] { 'H', 'e', 'l', 'l', 'o'}, 0, 5);

//set SMS end symbol

m_serialPort2.Write(new byte[] { 0x1A }, 0, 1);

五、怎样通过CMPP短信网关下发wap push ,相对于下发普通短信,有两个地方不同。
  1、CMPP_SUBMIT消息包的部分参数值改变。具体是:  
Msg_Fmt = 4(表示消息内容是二进制),
      TP_pid = 0;
      TP_udhi = 1;
2、字段Msg_Content的内容是二进制数字,有特定的组合方式。格式解析起来,就是所谓的
      “压缩后的XML“,即WBXML,一共有7个部分,把每个部分的二进制码按顺序组合起来填入
      Msg_Content字段,当做普通短信下发即可。代码大概如下:
 
  char szWapPushHeader1[12] = {0x0B, 0x05, 0x04, 0x0B, 0x84, 0x23, 0xF0, 0x00, 0x03,
                               0x03, 0x01, 0x01};
  char szWapPushHeader2[9] = {0x29, 0x06, 0x06, 0x03, 0xAE, 0x81, 0xEA, 0x8D, 0xCA};
  char szWapPushIndicator[8] = {0x02, 0x05, 0x6A, 0x00, 0x45, 0xC6,0x0C, 0x03};
  char szWapPushDisplayTextHeader[3] = {0x00, 0x01, 0x03};
  char szEndOfWapPush[3] = {0x00, 0x01, 0x01};
 
  //以上数字串是什么意思,估计有几个说明可以参考下, 又是前人经验:
  //0B WAP PUSH头部的总长度
  //05040B8423F0表示接下来是一个WAP PUSH
  //00 表示是Concatenated Short Messages
  //03 长度
  //03 reference number
  //01 表示分成1个短信发送
  //01 当前包的序号
  //这个并不不影响功能的样子。好象只需要知道分几条短信和
  //序号发就可以了。以上每个部分,也有其他可以通过测试的不同的串值,目前只测了这种
  //常见的值。
  //以下两个字串就是需要自己填写的了:
  //szWapPushUrl:wap push的目的链接,费尽心机不就是想把这个发出去嘛。要求是"去除了
  //http://前缀的UTF8编码的Url地址"的二进制编码。现在是小测试,直接写上值吧,否则应
  //该是经过编码转化的。以下url内容是"wap.sina.com.cn"
  char szWapPushUrl[12]  = {0x77,0x61,0x70,0x2E,0x73,0x69,0x6e,0x61,0x2e,0x63,0x6f,0x6d};
 
  //这个,就是想在手机上显示的关于这个URL的文字说明了,在我的手机上显示成该wap push
  //的标题.也同样是"UTF8编码的二进制"内容是"好好学习"
  char szMsg[12] = {0xE5,0xA5,0xBD,0xE5,0xA5,0xBD,0xE5,0xAD,0xA6,0xE4,0xB9,0xA0};
具体的实现代码如下:
char szHex[1024];
  int iUrllen,iMsgLen,iLen;
  iUrllen = 12;
  iMsgLen = 12;
  memset(szHex, 0, sizeof(szHex));
  iLen = 0;
  memcpy(szHex, szWapPushHeader1, 12);
  iLen += 12;
  memcpy(szHex+iLen, szWapPushHeader2, 9);
  iLen += 9;
  memcpy(szHex+iLen, szWapPushIndicator, 8);
  iLen += 8;
  memcpy(szHex+iLen, szWapPushUrl, iUrllen);
  iLen += iUrllen;
  memcpy(szHex+iLen, szWapPushDisplayTextHeader, 3);
  iLen += 3;
  memcpy(szHex+iLen, szMsg, iMsgLen);
  iLen += iMsgLen;
  memcpy(szHex+iLen, szEndOfWapPush, 3);
  iLen += 3;
  Msg_Length = iLen;
  memcpy((char*)Msg_Content, szHex, Msg_Length);
 
  //把Msg_Content当普通短信下发就可以了。对于push很多地方是被运营商给屏蔽了。

六、Cookie文件格式,默认位置:默认位置是Windows\Profiles\Guest\Cookies,持久性cookie,有一个截止日期,都存储在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders的注册表项中指定的位置;
如果没有到期日,会话cookie都存储在内存中,并且只提供给创建它们的进程使用。
所以,要设置一个多个进程都可以使用的cookie,必须设置好到期日。
格式如下:
 cnt_uid_www
 fa565c5abe27b0eb1f0497
 csdn.net/
 1536
 560450176
 29956594
 2009325664
 29943116
 *
 其中
 第1行为Cookie名称;
 第2行是Cookie的值;
 第3行是Cookie所属站点的地址;
 第4行是个标记值;
 第5行为超时时间的低位(Cardinal/DWORD);
 第6行为超时时间的高位;
 第7行为创建时间的低位;
 第8行为创建时间的高位;
 第9行固定为 * ,表示一节的结束。
 一个文件可能包含有多个节,按上面的格式循环即可。
 
也可以用程序来写cookie,当打开相关网页时,网页可自动识别,虽然这样的实际应用并不是很常见。
 InternetSetCookie(L"csdn.net/", L"cnt_uid_www", L"fa565c5abe27b0eb1f0497;expires=Sat,10-Jul-2010 00:00:00 GMT");
 如上,“expires=Sat,10-Jul-2010 00:00:00 GMT”指定了cookie的有效期限。
注册表位置:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer \Shell Folders,下面的
Cache、Cookies、History三个子键路径中的“Windows\”全部换成“Storage Card\”即可。系统会自动在SD卡上创建自己的路径。
再将Windows目录下的profiles整个文件夹删掉,文件目录已经建立到SD卡上的 \Storage Card\profiles了,

posted on 2010-04-10 16:52 Benjamin 阅读(1071) 评论(0)  编辑 收藏 引用 所属分类: PDA/PPC开发


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