无聊客的专栏

寻找逝去的岁月

陈军ID:yzx0023
48829次访问,排名2146好友6人,关注者31
yzx0023的文章
原创 16 篇
翻译 0 篇
转载 0 篇
评论 363 篇
无聊客的公告
本BLOG所有文章都系作者无聊客原创,请尊重作者辛苦劳动,转载请注明版权出处。
最近评论
hans:每条SMS有唯一标识吗?如何取得?
就像联系人的OID~~~
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759QQ
壳牌润滑油http://www.ctrhy.com
tony:和你做个友情链接好吗?
影子40524759
美孚润滑油http://www.ctrhy.com
文章分类
收藏
    相册
    me
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何使用PPC Notification (By 无聊客)收藏

    新一篇: Windows Mobile5.0 安全模型学习笔记 by无聊客( 一 ) | 旧一篇: (原创)CE MAPI实例讲解 --- 如何获取Inbox里的所有消息(二)

    2003WM5PPC Notification 支持做了一下改进,但是SDK并没有做详细的描述,至少我下载的5.0 PPC SDK没有,只能自己硬啃头文件,所以我将自己一些平时使用Notification的一些心得记录下来,一来做个备忘(笔者忘东西的速度很快),二来也希望帮助下那些还没用过Notification的朋友,啃啃头文件真的很痛苦。

         长话短说,让我们从最简单的开始:

    1.最简单的Tray Notification:

                     

                         (1-1)

     

       

                        (1-2)

     

           const DWORD NOTIFICATION_ID          = 4711; //定义Notification ID

         const GUID guidNotificationSample    = { 0x35466543, 0x77EF, 0x5676, { 0x23, 0x77, 0x35, 0xA2, 0x55, 0x3A, 0xB1, 0x43 } }; //定义clsid,你可以自己随意定制,当然这个clsid也有它自己的意义,通过它你可以在系统Notification设置页面由PDA用户对你的Notification进行个性化设置,这个在以后会介绍到。

         SHNOTIFICATIONDATA g_NotifyData;

     

           BOOL CreateNotification(LPCTSTR szHtml)

         {

              ZeroMemory(&g_NotifyData, sizeof(SHNOTIFICATIONDATA));

              g_NotifyData.cbStruct       = sizeof(SHNOTIFICATIONDATA);

              g_NotifyData.npPriority      = SHNP_ICONIC;//SHNP_INFORM;

              g_NotifyData.csDuration      = 5;

              g_NotifyData.hwndSink      = g_hWnd; 

              g_NotifyData.pszHTML        = szHtml;

              g_NotifyData.hicon          = g_hIcon;   

              g_NotifyData.pszTitle      = _T("Test Notification");

              g_NotifyData.grfFlags      = SHNF_DISPLAYON;

              g_NotifyData.dwID           = NOTIFICATION_ID;

              g_NotifyData.clsid          = guidNotificationSample;

     

              return ERROR_SUCCESS == SHNotificationAdd(&g_NotifyData);

         }

     

         void RemoveNotification()

         {

              SHNotificationRemove( &(g_NotifyData.clsid), g_NotifyData.dwID );

         }

     

         我们基本上主要通过SHNotificationAdd通知Tray产生一个Notification,这个过程是异步的。通过SHNotificationRemove移除一个Notification

         现在我们来简要介绍一下SHNOTIFICATIONDATA结构,通过修改它的值我们可以产生不同样式的Notification.

         typedef struct _SHNOTIFICATIONDATA

         {

             DWORD        cbStruct;     //通常为sizeof(SHNOTIFICATIONDATA)

             DWORD        dwID;         //ID

             SHNP         npPriority;   //priority, 目前有两种取值,SHNP_ICONIC代表只显示ICON,如图1-1所示,SHNP_INFORM表示在显示ICON的同时显示BUBBLE,如图1-2所示。

             DWORD        csDuration;   // duration of the notification (usage depends on prio),注意单位为秒,当BUBBLE显示了指定时间后会自动收起。

             HICON        hicon;        // the icon for the notification

             DWORD        grfFlags;     // 样式设置,接下来会详细讲述。

             CLSID        clsid;        // unique identifier for the notification class

             HWND         hwndSink;     // window to receive command choices, dismiss, etc.指定消息接收方窗口

             LPCTSTR      pszHTML;      // HTML content for the bubble,设置需要在BUBBLE上显示的文本,注意它是支持HTML的,通过HTML我们可以显示出更加丰富的内容,这个以后也会提到。

             LPCTSTR      pszTitle;     // Optional title for bubble,BUBBLE的标题

             LPARAM       lParam;       // User-defined parameter

             union

             {                            // Defines the softkey bar for the notification

                  SOFTKEYMENU skm;        // Either pass an HMENU in skn (and set SHNF_HASMENU)

                  SOFTKEYNOTIFY rgskn[NOTIF_NUM_SOFTKEYS];  // or two softkeys in rgskn.

             };                          //这个UNION主要是为了个性化Notification的菜单和通知消息,以后会介绍。

             LPCTSTR    pszTodaySK;      // Text to put on SK2 on the Today screen. If NULL, will default to "Notification"见下面的解释

             LPCTSTR    pszTodayExec;    // What to execute when SK2 is pressed. If NULL, the toast will be displayed.  见下面的解释

    } SHNOTIFICATIONDATA;

     

         关于pszTodaySKpszTodayExec在平时的工作中并没有用到,但是经过实验结果如下:

         pszTodaySK用于在Today Screen左下BUTTON位置显示指定字符串(应该就是指的SK2

         pszTodayExec指定当SK2被点击时会被调用的程序全路径。

     

         比如在CreateNotification中加上如下代码:

         g_NotifyData. pszTodaySK    = _T(a);

         g_NotifyData. pszTodayExec  = _T(\\Windows\\tmail.exe);

         效果如图1-3所示,当点击a时,会调用tmail.exe

            

                       (图1-3

     

    2.不同样式的tray Notification:

         通过设置不同的grfFlags,可以产生不同样式的Notification,下面来简单介绍一下各种值的含义:

         SHNF_STRAIGHTTOTRAY:

             直接放置ICON,但是默认不会弹出BUBBLE,只有当用户点击Tray Icon时,BUBBLE才会弹出。

     

         SHNF_CRITICAL

             Notification的标题和边框加粗显示。

     

         SHNF_FORCEMESSAGE

             强制BUBBLE添加时自动弹出,并且忽略用户在Setting里对Notification的设置,作用与SHNF_STRAIGHTTOTRAY相反。

     

         SHNF_DISPLAYON

             默认BUBBLE添加时自动弹出,与SHNF_FORCEMESSAGE不同的是它会考虑用户对Notification的设置。

     

         SHNF_SILENT

             取消Notification显示时的声音和震动效果,通常在Update Notification时很有用。它不考虑用户对Notification的设置。

     

         SHNF_HASMENU

             表明提供了一个Menu,允许创建者加上自己的菜单。

     

         以下四个因为平时没用过,待试过之后补充:

         SHNF_TITLETIME         // Draw the current time with the title

         SHNF_SPINNERS          // A notification with "stack" support

         SHNF_ALERTONUPDATE     // RE-play physical alerts on an update

         SHNF_WANTVKTTALK       //Capture the VK_TTALK button and forward it to the notification's sink window

     

    3.Notification菜单管理

         A)  使用Soft-Key

             我们可以通过设置SHNOTIFICATIONDATA里的成员:

                  SOFTKEYNOTIFY rgskn[NOTIF_NUM_SOFTKEYS];

             来设置左右两个Sift-Key对应菜单(分别对应rgskn[0]rgskn[1])。让我们修改下CreateNotification函数:

             BOOL CreateNotification(LPCTSTR szHtml)

              {

                  ZeroMemory(&g_NotifyData, sizeof(SHNOTIFICATIONDATA));

                  g_NotifyData.cbStruct       = sizeof(SHNOTIFICATIONDATA);

                  g_NotifyData.npPriority      = SHNP_ICONIC;//SHNP_INFORM;

                  g_NotifyData.csDuration      = 5;

                  g_NotifyData.hwndSink      = g_hWnd; 

                  g_NotifyData.pszHTML        = szHtml;

                  g_NotifyData.hicon          = g_hIcon;   

                  g_NotifyData.pszTitle      = _T("Test Notification");

                  g_NotifyData.grfFlags      = SHNF_DISPLAYON;

                  g_NotifyData.dwID           = NOTIFICATION_ID;

                  g_NotifyData.clsid          = guidNotificationSample;

     

                  g_NotifyData.rgskn[0].pszTitle       = _T("L_SoftKey");               //显示BUTTON文字

                  g_NotifyData.rgskn[0].skc.grfFlags   = NOTIF_SOFTKEY_FLAGS_DISMISS;   //BUTTON flag,详细介绍看后面

                  g_NotifyData.rgskn[0].skc.wpCmd      = 1000;                          //CMD ID,当用户点击该BUTTON时,将会发WM_COMMAND给通知窗口,WPARAM为该值。

                  g_NotifyData.rgskn[1].pszTitle       = _T("R_SoftKey");

                  g_NotifyData.rgskn[1].skc.grfFlags   = NOTIF_SOFTKEY_FLAGS_HIDE;

                  g_NotifyData.rgskn[1].skc.wpCmd      = 1001;

     

                  return ERROR_SUCCESS == SHNotificationAdd(&g_NotifyData);

             }

     

             看看效果:

            

                       (图3-1

     

             以下是目前系统支持的一些Flag

             NOTIF_SOFTKEY_FLAGS_DISMISS       // Remove the notification when the softkey is pressed,当用户点击时,自动移除Notification

             NOTIF_SOFTKEY_FLAGS_HIDE          // Hide the notification when the softkey is pressed (but do not dismiss),当用户点击时,自动隐藏Notification

             NOTIF_SOFTKEY_FLAGS_STAYOPEN      // Do not dismiss or hide the notification when the softkey is pressed,当用户点击时,不要移除或者隐藏Notification

             NOTIF_SOFTKEY_FLAGS_SUBMIT_FORM   // Submit the HTML form in the associated notification instead of sending WM_COMMAND to the sink,提交HTML页面

             NOTIF_SOFTKEY_FLAGS_DISABLED      // This softkey is disabled,该BUTTONdisabled状态的

     

    B)       使用自定义菜单:

         首先自定义一个菜单,随便举个例子:

             IDR_MENU MENU DISCARDABLE

             BEGIN

                  POPUP "Menu"

                  BEGIN

                       MENUITEM "Menu 1",     IDM_MENU_ONE

                      MENUITEM "Menu 2",     IDM_MENU_TWO

                      MENUITEM "Menu 3",     IDM_MENU_THREE

                  END

         END

     

         然后修改CreateNotification如下:

             BOOL CreateNotification(LPCTSTR szHtml)

              {

                  ZeroMemory(&g_NotifyData, sizeof(SHNOTIFICATIONDATA));

                  g_NotifyData.cbStruct       = sizeof(SHNOTIFICATIONDATA);

                  g_NotifyData.npPriority      = SHNP_ICONIC;//SHNP_INFORM;

                  g_NotifyData.csDuration      = 5;

                  g_NotifyData.hwndSink      = g_hWnd; 

                  g_NotifyData.pszHTML        = szHtml;

                  g_NotifyData.hicon          = g_hIcon;   

                  g_NotifyData.pszTitle      = _T("Test Notification");

                  g_NotifyData.grfFlags      = SHNF_DISPLAYON | SHNF_HASMENU; //加上SHNF_HASMENU,表示创建者会自行创建MENU

                  g_NotifyData.dwID           = NOTIFICATION_ID;

                  g_NotifyData.clsid          = guidNotificationSample;

     

                  g_NotifyData.skm.hMenu = ::LoadMenu( g_hInst, MAKEINTRESOURCE(IDR_MENU) );     //设置Menu资源

                  g_NotifyData.skm.cskc  = 2;                                                    //说明我们有3Item需要修改默认行为,关于这点需要说明一下,如果你没有为某个ITEM设置行为,默认如果用户点击了这个ITEM,那么Notification按照NOTIF_SOFTKEY_FLAGS_DISMISS处理,将会移除Notification

                  g_NotifyData.skm.prgskc = new SOFTKEYCMD[2];                                   //分配空间

                  g_NotifyData.skm.prgskc[0].grfFlags       = NOTIF_SOFTKEY_FLAGS_HIDE;         

                  g_NotifyData.skm.prgskc[0].wpCmd          = IDM_MENU_ONE;                      //说明Item:IDM_MENU_ONE行为为Hide

                  g_NotifyData.skm.prgskc[1].grfFlags       = NOTIF_SOFTKEY_FLAGS_STAYOPEN;

                  g_NotifyData.skm.prgskc[1].wpCmd          = IDM_MENU_TWO;                      //说明Item:IDM_MENU_TWO行为为Stay Open

                                                                                                 //3ITEM: IDM_MENU_THREE我们没有给它设置,那么按照刚才所说的,点了它之后系统将会自动移除Notification

     

                  return ERROR_SUCCESS == SHNotificationAdd(&g_NotifyData);

             }

     

         执行后效果如下图3-2所示,里面分配的内存和资源记着适时释放。

        

                  (图3-2

     

           先写到这里,以后有空将继续介绍如何在Notification里显示图片以及如何在系统Setting里面添加自定义Notification管理项,以上有什么不对或者不全的地方,还望大家多指教,谢谢!

          无聊客

    yzx0023@gmail.com

    2006.3.11

    发表于 @ 2006年03月11日 17:12:00|评论(loading...)|编辑

    新一篇: Windows Mobile5.0 安全模型学习笔记 by无聊客( 一 ) | 旧一篇: (原创)CE MAPI实例讲解 --- 如何获取Inbox里的所有消息(二)

    评论

    #flypeng 发表于2006-04-06 10:47:00  IP: 221.232.153.*
    你好,你的文章对我前期的读取短信很大的帮助,这里向你表示非常的感谢.我想请教另一个问题:关于收到一个新的sms的时候,我我如何才能捕捉到这个事情的发生?一般这是怎么处理处理的?是怎么样的一个过程呢?期待你的指点!谢谢
    #yzx0023 发表于2006-04-10 16:18:00  IP: 218.108.41.*
    to flypeng:应该有两种办法,一种是通过注册pushrouter来获取,可以参考一下PushRouter_RegisterClient系列的API,如果你只是想获取简单的SMS,你可以通过IMailRuleClient实现
    #jin 发表于2006-07-07 15:21:00  IP: 124.91.19.*
    非常感谢你的文章,但我还是没调试出来,能不能把源码加上去,特别是使用自定义菜单的源码,SHNF_HASMENU这个宏不能用,请把整个工程的源码加进去吧
    #yzx0023 发表于2006-07-08 22:02:00  IP: 60.176.254.*
    请注意,这个是在2005 PPC SDK上新加的,如果你使用的是2003的,那么SHNF_HASMENU是没有定义的
    #great_mountain 发表于2006-07-13 13:23:00  IP: 10.193.74.*
    关于收到一个新的sms的时候,我如何才能捕捉到这个事情的发生, 除了这两种外还有没有其他方法?比如:smartphone里短信处理程序是如何捕获到这个事件的
    #yzx0023 发表于2006-07-13 20:43:00  IP: 220.191.34.*
    To great_mountain:关于截获SMS,你可以试试IMailRuleClient,例子在SDK Sample下面就可以找的到
    #Jonason123 发表于2007-01-17 15:05:32  IP:
    你好,看了你的文章,这个SHNotificationAdd在Pocket pc2003和wm5.0上实现的效果好像不一样啊!wm5.0弹出的东西是在下面的,Pocket pc2003是弹在上面的,怎么在wm5.0下实现Pocket pc2003的效果啊
    #yzx0023 发表于2007-01-24 21:13:24  IP:
    to Jonason123: 这个是Windows Mobile风格的改变,我目前还不知道有什么办法能做到和03的一样
    #wuzhijie 发表于2007-02-06 10:42:41  IP:
    你好!看了你的文章,在添加Notification时,如果设置g_NotifyData.hwndSink = NULL 没有问题,可是将 g_NotifyData.hwndSink = this->GetSafeHwnd();
    时出错:
    wincore.cpp 2592行
    ASSERT(nID == 0 || ::IsWindow(hWndCtrl));请问是不是还要修改什么设置啊?
    #yzx0023 发表于2007-02-06 18:20:11  IP: 218.108.41.*
    this->GetSafeHwnd?你确定你的窗口是有效的?从错误来看,你的通知窗口是个无效窗口
    #alps1804 发表于2007-08-20 18:26:13  IP: 210.13.110.*
    老大,最近一直在研究这个问题,然后偶然间找到这篇文章,惊为天人,特此崇拜一下!
    我想就notification问个问题,icon的位置是怎样确定的,还是随机定的?有无办法可以定制!谢谢。拜服!
    #ddtlin 发表于2007-08-24 11:56:56  IP: 211.22.73.*
    講解的不錯~還蠻實用的~不過我怎麼都看不到圖! 總是少了些感覺~
    #yzx0023 发表于2007-08-27 22:23:56  IP: 125.120.169.*
    To alps1804:位置目前还没有什么办法去改变,是由于系统决定的。
    #yzx0023 发表于2007-08-27 22:25:02  IP: 125.120.169.*
    To ddtlin:这篇文章上传的时候是有图片的,但是那个时候CSDN有问题弄不出来,现在图片也不知道丢哪里了,没办法了,以后有空再补上,谢谢关心,呵呵!
    #balial 发表于2007-09-03 16:46:21  IP: 219.142.122.*
    无聊客您好,看您文章中提到“以后有空将继续介绍如何在Notification里显示图片以及如何在系统Setting里面添加自定义Notification管理项”我现在正在作相关的东西,但是无从下手,能不能请您有空的时候大概讲解一下原理和相关资料,谢谢
    #yzx0023 发表于2007-09-07 08:58:20  IP: 218.108.85.*
    To balial: Notification支持HTML,所以你只需要书写一段HTML,并放好需要显示的图片即可
    #balial 发表于2007-09-07 09:52:11  IP: 219.142.122.*
    谢谢无聊客,我还有一个问题想请教一下,就是我现在知道修改注册表项可以添加setting自定义notification管理项,但是不知道怎么与通知事件关联上,还是说当需要通知时自己读取注册表配置再调用SHNotificationAdd进行通知,还有就是能否自定义通知铃声呢?谢谢
    #garreet 发表于2007-11-05 18:04:50  IP: 172.16.50.*
    无聊兄:

    我看了你的这篇文章,现在有一个需求,我希望在Notification中改变菜单,请问有什么方法,我实验了几种,都无效。

    我的需求:在状态1,选择第一个菜单,其中左右各有一个菜单按钮。
    在状态2,选择第二个菜单,其中左边没有按钮,右边有一个按钮,可以和菜单1的右边按钮作用相同。

    请您帮忙看下,谢谢!

    garreet
    #ITgirl 发表于2007-11-06 21:33:08  IP: 222.130.211.*
    你好,我想请教一个问题:Notification支持HTML,那么对于在HTML中的按钮,按下之后如何通知到当前窗口呢?请您给点提示吧,非常感谢:)
    #yzx0023 发表于2007-11-09 14:03:58  IP: 218.108.85.*
    to ITgirl:一般是通过发送WM_COMMAND消息通知
    #yzx0023 发表于2007-11-09 14:05:21  IP: 218.108.85.*
    to garreet :不是很明白你的意思,最好有图的画可以发到我的信箱,谢谢!
    #nihao38 发表于2007-11-16 17:51:59  IP: 218.5.82.*
    SHNOTIFICATIONDATA 中clsid
    CLSID_SHNAPI_OemNotif1
    CLSID_SHNAPI_OemNotif2
    CLSID_SHNAPI_OemNotif3

    我现在不用自定义的clsid, 这三个值分别是多少,
    #jjsnower 发表于2007-12-18 20:14:32  IP: 222.67.172.*
    这个在wm6.0上弹出的东西只能显示在底部,有没有方法在wm6.0上实现弹出的那个东西,显示在上面,就像信号强度,音量那样的效果?
    #zjm 发表于2007-12-19 14:33:08  IP: 220.194.19.*
    无聊客,您好,我想问个问题,我在SHNotificationAdd添加气泡的时候有时候成功,但有时候确不成功,返回87(应该是参数错误),但实在是找不出为什么会出现这种情况,还请您指教,不胜感激!
    #simon 发表于2008-02-22 16:56:08  IP: 124.74.237.*
    g_NotifyData.skm.hMenu = ::LoadMenu( g_hInst, MAKEINTRESOURCE(IDR_MENU) ); //设置Menu资源

    g_NotifyData.skm.cskc = 2; //说明我们有3个Item需要修改默认行为,关于这点需要说明一下,如果你没有为某个ITEM设置行为,默认如果用户点击了这个ITEM,那么Notification按照NOTIF_SOFTKEY_FLAGS_DISMISS处理,将会移除Notification。

    g_NotifyData.skm.prgskc = new SOFTKEYCMD[2]; //分配空间

    g_NotifyData.skm.prgskc[0].grfFlags = NOTIF_SOFTKEY_FLAGS_HIDE;

    g_NotifyData.skm.prgskc[0].wpCmd = IDM_MENU_ONE; //说明Item:IDM_MENU_ONE行为为Hide。

    g_NotifyData.skm.prgskc[1].grfFlags = NOTIF_SOFTKEY_FLAGS_STAYOPEN;

    g_NotifyData.skm.prgskc[1].wpCmd = IDM_MENU_TWO; //说明Item:IDM_MENU_TWO行为为Stay Open。

    //第3个ITEM: IDM_MENU_THREE我们没有给它设置,那么按照刚才所说的,点了它之后系统将会自动移除Notification。



    return ERROR_SUCCESS == SHNotificationAdd(&g_NotifyData);


    我加自定义菜单后,一直拿不到点击菜单的消息,请指点一下,谢谢!!!!!
    #Alex 发表于2008-08-20 11:46:45  IP: 122.116.95.*
    Hello 大大: