一键按下 响起模拟来电

模仿功能:模拟来电

模仿对象:来电通

开发平台:Windows Mobile平台

当你希望一个借口,希望手机响起来电铃声,希望借此离开,只用手轻轻一碰手机,奇迹就会出现……

模拟来电设计思路

与网友约会,不小心碰到恐龙;MM约你压马路,老爸却要你陪他看球……很多时候,你是否十分的期待你手机的来电铃声欢快的响起:“你有一个电话……”,拯救你于水火之中?这就是我们要模仿开发的模拟来电工具的功能。

有了这个工具,只需要你的手划过手机时,轻轻的碰一个按键,一个设定好的来电就激活了。要开发这个工具,先要设计一个来电界面,然后从电话簿中读取联系人的详细信息,并将联系人信息显示到窗体上,再响起来电铃声和开启震动(图1)。

clip_image002[4]

如何调用联系人

要调用联系人,就要用到PPOM。PPOM(Pocket Outlook Object Model )是基于微软COM技术的一套针对手机上(PIM)个人信息管理的COM接口库。 POOM不仅包含了对联系人的操作,还包含了任务、约会提醒等关于个人信息管理的内容。

在Windows Mobile 5之前,要想访问联系人等信息,我们只能借助PPOM中相关的本地API。伴随着Windows Mobile5的发布,在WM5的SDK中,公布了下面几个托管函数命名空间: Microsoft.WindowsMobile.Configuration、 Microsoft.WindowsMobile.Forms 、 Microsoft.WindowsMobile.PocketOutlook 、 Microsoft.WindowsMobile.PocketOutlook.MessageInterception 、 Microsoft.WindowsMobile.Status 、 Microsoft.WindowsMobile.Telephony 。

利用它们,可以很方便的完成以前必须借助本地函数才能实现的功能。为了访问联系人信息,我们需要使用“Microsoft.WindowsMobile.PocketOutlook”命名空间的一些对象,读取该联系人的各种信息,例如姓名,电话,地址,类别等。

利用POOM,可以随意控制PPC和SP上的E-mail、短信、联系人、约会、任务,可以开发电话簿管理程序,可以开发短信管理程序,可以开发电话簿、短信息备份程序,个人事务管理程序等。

模拟来电设计步骤

第一步:创建项目

启动Visual Studio 2008,选择“文件→新建项目”。在弹出的“新建项目”的“项目类型”中选择“Visual C#→智能设备”,“模板”选“智能设备项目”,“名称”设为“IncomingCall”。在弹出的“添加新智能设备项目”对话框中,“目标平台”选择“Windows Mobile 6 Professional SDK”,“.Net Compact Framework 版本”选择“.Net Compact Framework Version 3.5”,“模板”选“设备应用程序”完成项目创建。

第二步:设计界面

右击“解决方案资源管理器”中的“Form1.cs”,重命名为“FormIncomingCall.cs”,Visual Studio 2008的重构功能会自动将该窗体的类名等都修改为“FormIncomingCall”。在“窗体设计器”选中该窗体,在“属性”浮动窗口中修改该窗体的“Text”属性为空。选中“MainMenu1”,添加两个子菜单,分别命名为“menuItemAnswer”、“menuItemIgnore”,子菜单的“Text”属性分别设置为“接听”、“拒绝”。

“智能设备项目”中的窗体,总是充满屏幕的,而我们需要的来电界面,是一个非全屏的窗体。右击“窗体设计器”中的“FormIncomingCall窗体”,点击“查看代码”修改FormIncomingCall()中的代码(修改后的代码下载地址为:http://www.shudoo.com/bzsoft)。

第三步:读取联系人信息

按一个键(可以自己设置),访问手机电话簿,随机读取一个联系人信息。实现这个目的,要引用“Microsoft.WindowsMobile.PocketOutlook”命名空间,该命名空间中提供了访问手机电话簿的方法。

依据实际来电界面,将获取的联系人信息绘制到非全屏窗体“FormIncomingCall”上。在这里,我们需要重写类“FormIncomingCall”的“OnPaint”,它在窗体需要重新绘制的时被调用。关键代码如下所示(完整代码下载地址为:http://www.shudoo.com/bzsoft):

          g.DrawRectangle(new Pen(ForeColor, 4), new Rectangle(0, 0, 229, 160));//绘制外框
                g.FillRectangle(new SolidBrush(SystemColors.ActiveCaption), 
new Rectangle(2, 2, 226, 20));//绘制标题栏
                g.DrawString("电话 - 拨入", Font, 
new SolidBrush(SystemColors.ActiveCaptionText), 10, 5);//绘制标题文本
                g.DrawString("中国移不动\r\n\r\n来电\r\n\r\n" +
                    contact.FileAs +// 姓名
                    "\r\n" +
                    contact.MobileTelephoneNumber + //移动电话
                    " 移", Font, new SolidBrush(ForeColor), 6, 24);
                g.DrawLine(new Pen(ForeColor), 0, 46, 230, 46);//绘制分割线

                if (contact.Picture != null)// 绘制联系人图片
                        g.DrawImage(contact.Picture, new Rectangle(152, 50, 72, 96),
                        new Rectangle(0, 0, contact.Picture.Width, contact.Picture.Height), 

第四步:播放来电铃声

我们需要来电界面显示的同时,播放来电铃声。在窗体设计器中双击“FormIncomingCall”窗体,添加窗体Load事件的响应,并将播放的代码加入“FormIncomingCall_Load”中。这一部的关键就是从注册表中[HKEY_CURRENT_USER\ControlPanel\Sounds\RingTone0]读取铃声文件路径。关键代码如下所示(完整代码下载地址为:http://www.shudoo.com/bzsoft):

        /// <summary>
        /// 获取当前来电铃声
        /// </summary>
        /// <returns>来电铃声文件名</returns>
        string GetRing()
            RegistryKey registryKey =
 Registry.CurrentUser.OpenSubKey(@"\ControlPanel\Sounds\RingTone0");
            string ringFileName = registryKey.GetValue("Sound").ToString();
            return ringFileName;
      
           soundPlayer.SoundLocation = GetRing();// 仅支持播放wav文件,如:"\\Windows\\You have an incoming call.wav";
            soundPlayer.PlayLooping();// 播放来电铃声

第五步:打开震动

.Net CF 尚未直接提供控制震动的方法。这里我们需要通过“P/Invoke”方式调用系统API。在“coredll.dll”中有这样两个函数

BOOL WINAPI NLedGetDeviceInfo( UINT nInfoId, void *pOutput ); 
BOOL WINAPI NLedSetDevice( UINT nDeviceId, void *pInput ); 

NLedGetDeviceInfo是获得LED数量,NLedSetDevice是来设置LED状态的,我们可以通过它来启动或者关闭Pocket PC设备的震动。

注意,一般PPC设备都有两个LED,一个就是扬声器0(Radio LED),另一个则是振动器1(Vibrator)了。不同机器的振动器,其设备index可能不同。 我们创建一个类“LED”,用以实现振动器的控制。相关代码请到http://www.shudoo.com/bzsoft下载。

当点击“接听”或“拒绝”菜单项的时候,需要执行相应的关闭动作。在窗体设计器中分别双击“接听”和“拒绝”菜单项,添加菜单项Click事件的响应,并将结束动作的代码加入事件响应的方法中。关键代码如下所示(完整代码下载地址为:http://www.shudoo.com/bzsoft):

        private void menuItemAnswer_Click(object sender, EventArgs e)
        { /点击了“接听”
            menuItemIgnore_Click(sender, e);
                
        private void menuItemIgnore_Click(object sender, EventArgs e)
        {
            soundPlayer.Stop();// 关闭铃声
            led.SetLedStatus(LED.Status.OFF);// 关闭震动
            Close();

第六步:运行程序

在VS2008中点击菜单“调试→启动调试”(或者直接按F5),在弹出的部署对话框中选择“Windows Mobile 6 Professional Emulator”,点击“部署”,可以在模拟器中看到运行效果了。

clip_image004

(载《电脑报》2009年21期)

原文地址:https://www.cnblogs.com/tanjian/p/1634179.html