1 引言

     以Windows CE 为操作系统的掌上电脑(如PocketPC或HPC),除具备PC的功能外,还具备很强的自身控制能力。Windows CE API超越微软其他操作系统的 API的一个方面是他提供了一个强有力的通知接口(NotificationAPI),该接口允许应用程式自己安排自己在某个确定的时间运行,或在某个系统事件发生时运行,这使得我们能够应用他来设计研发各种高级控制程式,比如按时间或预订的事件来自动开启/关闭电脑,或按时间或预订的事件来自动开启/关闭一个或多个应用程式,乃至控制一个或多个应用程式的运行流程。

2 通知API的解析

    所谓通知是操作系统对发生的某个事件所发出的响应信号。Windows CE对定时器事件发出的响应信号即“定时器事件通知”,而对系统事件发出的响应信号即“系统事件通知”。定时器事件表明已到达指定时间,系统事件表明发生了系统级事件,如添加或删除了某设备,系统时间更改了,和其他设备发生同步,检测到RS232口连接等。假如我们要在给定的时间直接运行某个应用程式(不用用户干涉),就能够简单地使用“定时器事件通知”,而当我们需要监控一些系统事件的发生时,就要使用″系统事件通知″。特别需要强调的是:除非不安装电池或处于死机状态,否则掌上电脑的电源始终不关闭;当用户按下关闭电源按钮或不使用时,机器也只是处于休眠状态而并没有真正切断电源(在休眠状态下,他仅提供能保持其时钟、应用程式及RAM中存储的数据所需的最少能量)。因此,对于注册使用“定时器事件通知”或″系统事件通知″的程式,即使系统是关闭的,当定时器事件到达时或发生系统事件时,要运行的应用程式也会启动。

上述的“定时器事件通知”的使用虽然方便,但有时不能满足用户的需要。比如对于复杂的控制流程,不但到了指定时间要运行应用程式,而且要根据用户的不同反应进行不同的控制。因此,Windows CE还提供了第三种通知接口: ″用户通知″。″用户通知″也使用定时器事件,但和“定时器事件通知”不同,“用户通知”发生时必须被用户确认,从而到了“用户通知”指定的时间可根据用户的不同反应进行不同的流程控制。比如,当用户仅需在指定的时间作一下提示,则使用“用户通知”的应用程式可设计为以四种方式(闪动LED,振动设备,播放声音和显示提示框)提示用户,而且用户可随时更改提示方式。又比如,当用户需要不但在指定的时间作一下提示,还要在用户做出确认后才使程式继续运行,这就只能使用“用户通知”而不能使用“定时器事件通知”。

当我们把自己研发的程式注册到特定的事件通知后,操作系统将在该事件发生时生成一个通知。系统使用通知和用户和其他程式通信。Windows CE共提供了六个通知接口:

CeSetUserNotification

CeGetUserNotificationPreferences

CeClearUserNotification

CeHandleAppNotifications

CeRunAppAtTime和CeRunAppAtEvent

前四个为″用户通知″所使用,后两个分别为“定时器事件通知”和″系统事件通知″所使用。下面分别介绍这六个API的使用方法:

(1)函数CeSetUserNotification用于注册用户通知,其原型是:

HANDLE CeSetUserNotification(

HANDLE hNotification, 

TCHAR* pwszAppName, 

SYSTEMTIME* lpTime, 

PCE_USER_NOTIFICATION lpUserNotification 

);

其参数含义是:句柄hNotification配置为0表示创建一个新的通知,而要更改已注册的通知则配置hNotification为希望更改的用户通知的句柄(这个句柄是由注册用户通知的程式在调用CeSetUserNotification后的返回值);pwszAppName是该应用程式的名称,当通知发生时,该应用程式的小图标将在任务栏上显示;lpTime是个指向SYSTEMTIME结构指针,该结构指定了通知发生的时间;lpUserNotification也是个结构指针,他指向PCE_USER_NOTIFICATION结构,
Windows CE用该结构描述用户怎样被通知,这个结构的定义是:

typedef struct UserNotificationType {

DWORD ActionFlags;

TCHAR* pwszDialogTitle;

TCHAR* pwszDialogText;

TCHAR* pwszSound;

DWORD nMaxSound;

DWORD dwReserved;

} CE_USER_NOTIFICATION, *PCE_USER_NOTIFICATION;

其中变量ActionFlags是一组定义了在到达指定的时间时以何种形式提示用户的标志:PUN_LED(闪动屏幕),PUN_VIBRATE(振动设备),PUN_DIALOG(显示对话框),PUN_SOUND(播放声音文档)和PUN_REPEAT(重复声音文档10到15秒),他能够是上述标志的任意组合。从程式调用CeSetUserNotification开始到用户得到通知的这一时间段中,通知一直处于活动状态。如要在他超时之前修改此通知,程式可通过再次调用CeSetUserNotification来实现

(2)调用CeGetUserNotificationPreferences,函数原型为:

BOOL CeGetUserNotificationPreferences(

HWND hWndParent, 

PCE_USER_NOTIFICATION lpNotification 

);

这个函数可配置用户通知,以便让用户能有修改提示方式的机会,其中hWndParent是提示框父窗口的窗口句柄。

(3)调用CeClearUserNotification能够实现在用户通知到达之前清除他。

(4)调用CeHandleAppNotifications 函数以确认用户通知。用户通知到达后需要确认。对于显示提示框的通知,确认的方式是点击提示框的确定按钮或按下设备外壳上的通知按钮(此时用户通知仅起到提示的作用,不启动应用程式);对于不显示提示框的通知,系统将在任务栏上显示注册该通知的程式的图标,当用户点击此图标时系统将启动相应的应用程式的一个实例(系统还传递一个命令行参数lpCmdLine以表明为什么应用程式会运行,该参数是串
APP_RUN_TO_HANDLE_NOTIFICATION加空格加通知的句柄)。对于不显示提示框的用户通知,在应用程式中要调用 CeHandleAppNotifications 函数来确认通知,该函数将任何用于应用程式的活动通知都标记为已处理,并删除任务栏上的图标。在实际编码时还要考虑是否有该应用程式的另一个实例在运行,如有,则应向他发送一个自定义消息由该实例处理此通知并终止自身以节省资源。

(5)调用CeRunAppAtTime生成“定时器事件通知”,函数原型为:

BOOL CeRunAppAtTime(

TCHAR* pwszAppName, 

SYSTEMTIME* lpTime 

);

其参数含义是:lpTime是个结构指针,该结构指定了运行应用程式的时间;pwszAppName是要运行的应用程式的名称。由于只是在给定的时间自动运行某个应用程式,因此比较简单。要修改“定时器事件通知”,只要再次调用CeRunAppAtTime。因为后一次调用CeRunAppAtTime将替换前一次的通知。要清除“定时器事件通知”,只要在调用CeRunAppAtTime时,在参数lpTime中传递一个NULL指针。

(6)调用CeRunAppAtEvent生成″系统事件通知″,函数原型:

BOOL CeRunAppAtEvent(

TCHAR* pwszAppName, 

LONG lWhichEvent 

);

其参数含义是:pwszAppName是要运行的应用程式的名称;lWhichEvent 是指出要监控哪一个事件,标志常量如下:

NOTIFICATION_EVENT_NONE 清除事件通知

NOTIFICATION_EVENT_SYNC_END 同步完成通知

NOTIFICATION_EVENT_DEVICE_CHANGE 添加或删除设备通知 

NOTIFICATION_EVENT_RS232_DETECTED 检测到RS232连接通知

NOTIFICATION_EVENT_TIME_CHANGE 系统时间更改通知

NOTIFICATION_EVENT_RESTORE_END 设备恢复完成通知

要停止响应系统事件通知,应用程式只要再次调用CeRunAppAtEvent,并在lWhichEvent参数中传递其名称和NOTIFICATION_EVENT_NONE。

3 通知API的使用代码实例

#include 

CE_USER_NOTIFICATION g_ceun; 

(1) 对CE_USER_NOTIFICATION结构初始化的代码片段. memset (&g_ceun, sizeof(g_ceun));

g_ceun.ActionFlags = PUN_DIALOG; 

g_ceun.pwszDialogTitle = szDlgTitle; 

g_ceun.pwszDialogText = szDlgText; 

g_ceun.pwszSound = szSound; 

g_ceun.nMaxSound = sizeof(szSound); 

(2)注册用户通知的代码片段:

SYSTEMTIME st; GetLocalTime (&st);

GetModuleFileName (hInst, szExeName,sizeof(szExeName));

hNotify = CeSetUserNotification (0, szExeName,&st, &g_ceun); 

(3)配置用户通知的代码段:

CeGetUserNotificationPreferences(hWnd, &g_ceun); 

(4)使用CeHandleAppNotifications并只运行一个实例(为节省资源)的代码段 :

//判断应用程式的启动是否源于用户通知

If (lstrcmp(szText,APP_RUN_TO_HANDEL_NOTIFICATION==0)

GetModuleFileName (hInst, szText, sizeof(szText));

CeHandleAppNotifications (szText); 

hNotify =(HANDLE)_wtol(pPtr); //取通知的句柄

//检查是否已有应用程式的实例在运行

hWnd = FindWindow(NULL, szAppName);

if(hWnd)//如有,向他发送一个自定义消息,由他处理此用户通知

SendMessage(hWnd, MYMSG_TELLNOTIFY, 0, (LPARM)hNotify);

//终止自身, 代码略去

(5)使用“定时器事件通知”的代码段: 

SYSTEMTIME st; GetLocalTime (&st);

GetModuleFileName (hInst, szExeName, sizeof(szExeName));

CeRunAppAtTime (szExeName, &st);

(6)使用“系统事件通知”的代码段:

LONG lEvent; 

if (IsDlgButtonChecked(hWnd, IDC_SYNC_END) ==1)

lEvent != NOTIFICATION_EVENT_SYNC_END;

if (IsDlgButtonChecked(hWnd, IDC_SERIAL_DETECT)==1) 

lEvent !=NOTIFICATION_EVENT_RS232_DETECTED; 

if (IsDlgButtonChecked(hWnd, IDC_DEVICE_CHANGE)== 1)

lEvent != NOTIFICATION_EVENT_DEVICE_CHANGE;

if (IsDlgButtonChecked(hWnd, IDC_TIME_CHANGE)==1)

lEvent != NOTIFACTION_EVENT_TIME_CHANGE; 

if (IsDlgButtionChecked(hWnd, IDC_RESTORE_END) ==1)

lEvent != NOTIFICATION_EVENT_RESTORE_END;

GetModuleFileName (hInst, szExeName, sizeof(szExeName); 

CeRunAPpAtEvent(szExeName, lEvent); 

以上我们介绍了Windows CE Notification API的使用方法,关于Windows CE应用程式研发环境的使用。

Windows CE Notification API的使用方法的更多相关文章

  1. HTML5桌面通知:notification api

    1. 为什么需要HTML5的桌面通知 传统的桌面通知可以写一个div放到页面右下角自动弹出来,并通过轮询等等其他方式去获取消息并推送给用户.这种方式有个弊端就是:当我在使用京东 进行购物的时候,我是不 ...

  2. Windows 8 动手实验系列教程 实验8:Windows应用商店API

    动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商店.考虑到世界范围内目前有超过 ...

  3. Windows应用商店API

    Windows应用商店API 动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商 ...

  4. HTML5 桌面通知:Notification API

    原文地址:http://blog.gdfengshuo.com/article/23/ 前言 Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是 ...

  5. Windows 下常见的反调试方法

    稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...

  6. Atitit.提升api兼容性的方法 v3 q326

    Atitit.提升api兼容性的方法 v3 q326 1. Atitit.兼容性的“一加三”策略1 2. 2. 扩展表模式1 3. 3. 同时运行模式1 3.1. 3.1. 完美的后向兼容性2 3.2 ...

  7. windows ce.net开发概述

    依据开发所处的层次以及开发工具的不同,能够将嵌入式系统开发分为系统开发和应用开发. 系统开发所涉及的内容包含三个方面:系统定制.驱动程序开发.操作系统一致(BSP开发). 一系统开发 (1)      ...

  8. 介绍一个比较酷东西:HTML5 桌面通知(Notification API)

    Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是脱离浏览器的,即使用户没有停留在当前标签页,甚至最小化了浏览器,该通知信息也一样会置顶显示出来 ...

  9. windows读取mac格式移动硬盘的方法

    本文记录了一些window与mac数据在移动设备上互相拷贝的经验. 一.准备 家里有一台mac电脑,限于硬盘空间比较小,需要定期备份一些数据. 由于备份数据大小在20G左右,并且并没有压缩为一个压缩文 ...

随机推荐

  1. MyEclipse的Debug模式启动缓慢

    打开breakpoints veiw,右键-> Remove all,重启下服务器就OK了 -–下面有个"顶"字,你懂得O(∩_∩)O哈哈~ -–乐于分享,共同进步! -–更 ...

  2. Spinner控件详解

    Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...

  3. React Native自定义导航条

    Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...

  4. ejabberd编译更新脚本

    ejabberd编译更新脚本 (金庆的专栏 2016.8) 用rebar编译ejabberd源码,然后复制编译所得beam文件到ejabberd安装目录, 调用ejabberdctl热更新. call ...

  5. HTTP状态码总结

    HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.有些 App 端接口与 HTML 接口用的是同一个,所以做移动端开发也有必要了解一下HTTP状态码 ...

  6. Android App之间通过Intent交互

    Android 最重要的功能之一是应用能够基于它要执行的"操作"向另一个应用发送用户. 例如,如果您的应用有您要在地图上显示的公司地址,您无需在显示地图的应用中构建 Activit ...

  7. Linux Java开发坏境搭建,Ubuntu-jdk+tomcat+eclipse+svn 包安装详细操作

    更新时间2015-03-15 更新2015-04-12 svn安装更新 第一步 安装jdk (在linux上使用yum安装JDK  http://blog.chinaunix.net/uid-1546 ...

  8. tf.app.run()

    在很多TensorFlow公布的Demo中,都有这样的代码存在,如下,这是干什么的呢? if __name__ == "__main__": tf.app.run() 我们来看一下 ...

  9. iOS开发之自己封装的提示框(警告框)样式BHAlertView

    最近需要使用到提示框(警告框)进行信息的展示和提醒,所以进行了一个类的封装,想用Swift调用此OC文件,但是发现有些困难,所以暂时先把OC代码进行展示,随后再好好研究一下在Swift中的使用. 对于 ...

  10. JDBC编程学习笔记之数据库连接池的实现

    在JDBC编程的时候,获取到一个数据库连接资源是很宝贵的,倘若数据库访问量超大,而数据库连接资源又没能得到及时的释放,就会导致系统的崩溃甚至宕机.造成的损失将会是巨大的.再看有了数据库连接池的JDBC ...