Windows CE Notification API的使用方法
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的使用方法的更多相关文章
- HTML5桌面通知:notification api
1. 为什么需要HTML5的桌面通知 传统的桌面通知可以写一个div放到页面右下角自动弹出来,并通过轮询等等其他方式去获取消息并推送给用户.这种方式有个弊端就是:当我在使用京东 进行购物的时候,我是不 ...
- Windows 8 动手实验系列教程 实验8:Windows应用商店API
动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商店.考虑到世界范围内目前有超过 ...
- Windows应用商店API
Windows应用商店API 动手实验 实验 8: Windows应用商店API 2012年9月 简介 编写Windows应用商店应用最令人瞩目的理由之一是您可以方便地将它们发布到Windows应用商 ...
- HTML5 桌面通知:Notification API
原文地址:http://blog.gdfengshuo.com/article/23/ 前言 Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是 ...
- Windows 下常见的反调试方法
稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...
- Atitit.提升api兼容性的方法 v3 q326
Atitit.提升api兼容性的方法 v3 q326 1. Atitit.兼容性的“一加三”策略1 2. 2. 扩展表模式1 3. 3. 同时运行模式1 3.1. 3.1. 完美的后向兼容性2 3.2 ...
- windows ce.net开发概述
依据开发所处的层次以及开发工具的不同,能够将嵌入式系统开发分为系统开发和应用开发. 系统开发所涉及的内容包含三个方面:系统定制.驱动程序开发.操作系统一致(BSP开发). 一系统开发 (1) ...
- 介绍一个比较酷东西:HTML5 桌面通知(Notification API)
Notification API 是 HTML5 新增的桌面通知 API,用于向用户显示通知信息.该通知是脱离浏览器的,即使用户没有停留在当前标签页,甚至最小化了浏览器,该通知信息也一样会置顶显示出来 ...
- windows读取mac格式移动硬盘的方法
本文记录了一些window与mac数据在移动设备上互相拷贝的经验. 一.准备 家里有一台mac电脑,限于硬盘空间比较小,需要定期备份一些数据. 由于备份数据大小在20G左右,并且并没有压缩为一个压缩文 ...
随机推荐
- Python强大的可变参数传递机制
今天模拟定义map函数.写着写着就发现Python可变长度参数的机制真是灵活而强大. 假设有一个元组t,包含n个成员: t=(arg1,...,argn) 而一个函数f恰好能接受n个参数: f(arg ...
- Unity3d导出场景地图寻路
Unity3d导出场景地图寻路(金庆的专栏)Unity3d中用无渲染的透明盒子摆出地面和阻档区域. this.renderer.enabled = false;所有这些盒子设为Navig ...
- 一个整数数组,有n个整数,如何找其中m个数的和等于另外n-m个数的和?
int getSum(int* arr, int len) { int sum = 0; for (int i = 0; i < len; ++i) { sum += arr[i]; } ret ...
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...
- FORM开发两种方式实现动态LIST
方法一:常规的,也是网上比较常见的 1.将目标ITEM的子类信息设置为List,不需要添加列表中元素,不需要初始值. 2.新建一个Procedure,代码如下: PROCEDURE basis_lis ...
- EBS销售订单挑库发放处理程序
来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...
- [Vim]vim学习笔记--多个文件打开,切换,关闭
一种情况是在shell中用vim打开多个文件,另一种是在vim编辑器中打开多个文件 同时打开多个文件 vim file1 file2 打开文件并水平窗口显示 vim -o file1 file2 打 ...
- SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)
SQLite 运算符 SQLite 运算符是什么? 运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算. 运算符用于指定 SQLite 语句中的条件 ...
- 1.0、Android Studio管理你的项目
项目概览 Android Studio中的项目包含了开发一个app的工作环境所需要的一切.从代码,到资源,到测试到构建配置.当你创建一个新的项目的时候,Android Studio为所有的文件创建了必 ...
- Dynamics CRM 依赖组件类型为应用程序功能区导致的无法删除实体问题的解决方法
看到有人问到这个问题,这边就简单描述下解决方法,主要是针对第一次碰到这个问题云里雾里的朋友,错误如下 在我们建lookup关联的时候有下图中的这么个设置,对于很多新手默认就是下图这样不会去做改动,因为 ...