[CF.Skills].Net CF中电话状态的捕获(Part 1)

摘要:本文阐述了如何在Windows Mobile 5.0以上的系统中获取电话状态,如接通,挂断等等,C#描述。
Keywords
Windows Mobile, .Net CF, PhoneState, SystemState, C#, BUG

之前写过一篇随笔:

[CF.Skills]在.NET Compact Framework中获取来电号码和屏蔽来电,本文算是它的狗尾续貂篇。

有些朋友在BBS上或者在我的blog上面留言问如何得知电话的接通状态,比如说接通,挂断或者挂起(等待)比较传统的方法是使用,Windows CETelephony API(TAPI),不过你可能要写比较麻烦的代码,可能涉及到一些回调函数。可以参阅SDK下面的cellcore例子。
Windows Mobile 5以后的机器上,你可以使用一些TAPIWrapper,在托管代码中实现它的相应功能。比如这里要提的SystemProperty.PhoneCallTalkingSystemProperty.PhoneActiveCallCount

下面的程序演示了如何利用他们来获得电话状态:

       public void ListenCall()
        {
            callState 
= new SystemState(SystemProperty.PhoneCallTalking);
            callCount 
= new SystemState(SystemProperty.PhoneActiveCallCount);
            callState.Changed 
+= new ChangeEventHandler(callState_Changed);
            callCount.Changed 
+= new ChangeEventHandler(callCount_Changed);
        }

        void callCount_Changed(
object sender, ChangeEventArgs args)
        {
            
if (args.NewValue != null && (int)args.NewValue !=0)
             MessageBox.Show(
"Call Incoming");
        }

        void callState_Changed(
object sender, ChangeEventArgs args)
        {
            
if (args.NewValue != null)
            {
                
String state = ((int)args.NewValue) == 1 ? "talking" : "hang up";
                MessageBox.Show(state);
            }
        }

 
运行效果:
来电

接电话

挂起

这里订阅的两个事件都很有用,callState.Changed是用来判断电话是否正在通话中,一旦状态发生改变,该事件被触发,当正在通话时,事件参数的值变为true,挂断时,事件参数的值为falsecallCount.Changed是当前接通的线路数量,有来电时+1(默认为零),挂断时-1

不过我发现这里有个问题,也许是CFBUG。当我移除或者替换MessageBox.Show("Call Incoming...");这一句的时候,callState.Changed似乎永远不会被触发了。我使用的使WM6 pro Emulator + Cellular Emulator做的测试。在我的设备上(Intel Xscale 416mhz, WM5 PPC phone,.Net CF 3.5)测试,按接听电话的键之后立即出现Phone对话框,仍然有不能触发callState.Changed的问题,似乎是事件监听的线程被阻塞, 这是否是CFBUG还有待进一步测试。
Sample下载在这里:Sample Download

Regards
©Freesc Huang
  黄季冬<fox23>@HUST

posted on 2008-03-12 14:40 Freesc Huang 阅读(2227) 评论(24) 编辑 收藏

评论

#1楼 2008-03-15 16:37 fish.sophia[未注册用户]

吖,原来你这么厉害。。。  回复 引用   

#2楼[楼主] 2008-03-28 17:33 fox23      

@fish.sophia
兄台客气了..
 回复 引用 查看   

#3楼 2008-03-31 22:38 quantity[未注册用户]

@fox23
我也遇到这个问题了,我在callCount_Changed里面加了一些代码,又注释掉,现在就死活不能触发这个事件了。真是郁闷。。。
 回复 引用   

#4楼 2008-04-01 00:18 quantity[未注册用户]

重启电脑和PPC,还是不行啊。。。bug不会这么顽固吧?  回复 引用   

#5楼 2008-04-02 16:22 quantity[未注册用户]

@fox23
你好,还想请教你一下,你获取这个消息,是在系统获取该消息之前还是之后呢?有没有什么办法可以先于系统获取这个消息吗?
 回复 引用   

#6楼 2008-04-28 14:36 zhz zhz[未注册用户]

MessageBox影响程序流程的情况我经常碰到,一直想不明白其中缘由 I'm zhz :)  回复 引用   

#7楼 2008-05-05 17:40 东方晓[未注册用户]

请问为何,拨出电话不能引发事件,
SystemState SS = new SystemState(SystemProperty.PhoneCallCalling);
SS.Changed += new ChangeEventHandler(SS_Changed);

有的人说这样可以,现在我在,EMULATOR中运行发现不可以, 不知哪里的原因.请楼主,指示.
 回复 引用   

#8楼[楼主] 2008-05-05 17:46 fox23      

@东方晓
http://www.cnblogs.com/fox23/archive/2008/02/15/phoneincoming.html
这篇文章评论中也许有你要的答案
 回复 引用 查看   

#9楼 2008-05-05 22:15 东方晓[未注册用户]

记得第一次看那篇文章就看到有了,谢谢提醒, 在47楼.找到了,先试一下,去谢,:)  回复 引用   

#10楼 2008-05-06 00:44 东方晓[未注册用户]

要更正一下,是在36楼,并且我也试过那段代码,并不能使拨出电话事件激活, 不知为什么, 只能使窗口显示到最前.  回复 引用   

#11楼 2008-05-07 00:25 齐楚[未注册用户]

我也发现了只要是移除 MessageBox.Show();程序基本就不运行了,很是疑惑不解.  回复 引用   

#12楼 2008-06-26 16:31 逆风飞扬      

黄老兄:
我想请教一下,能否在来电的时候把系统来电的窗体隐藏呢?我现在只能move掉.呵呵.多谢!
 回复 引用 查看   

#13楼[楼主] 2008-06-30 20:08 fox23      

@逆风飞扬
需要P/Invoke 先FindWindow获取到来电窗体的句柄再用ShowWindow(XXX,SW_HIDE)来隐藏它.如果你有更好的实现方法欢迎与我分享:-)
最近比较忙,不能及时回复见谅~~
 回复 引用 查看   

#14楼[楼主] 2008-06-30 20:08 fox23      

@齐楚
请添加适当的延时~
 回复 引用 查看   

#15楼 2008-08-09 11:48 蓝浪[未注册用户]

“需要P/Invoke 先FindWindow获取到来电窗体的句柄再用ShowWindow(XXX,SW_HIDE)来隐藏它”
请问,具体是怎样实现的?
 回复 引用   

#16楼 2008-10-08 19:51 斑马[未注册用户]

如何获得来电号码  回复 引用   

#17楼 2008-11-06 17:11 hdz[未注册用户]

这人太牛了  回复 引用   

#18楼 2009-04-15 11:22 lanruoshui      

黄老师,事件不触发的问题有解决方案了么,为什么会不触发Changed事件?  回复 引用 查看   

#19楼 2009-05-11 15:16 小名鼎鼎

楼主好牛,想请教下一个电话来了以后没有接通前的状态怎么获取?就是怎么获取incomingcall这个状态  回复 引用   

#20楼 2009-08-18 10:52 小z[未注册用户]

你好!我有个问题想请教一下,在我开发的WIN mobile小程序中,能够进行电话接听,但在我里接听后,系统里将这个已经被接听的电话显示为未接听?请问是什么原因?有没有解决办法?  回复 引用   

#21楼 2009-10-29 10:49 webbdane[未注册用户]

那我打电话的事件怎么监听到呀。。。  回复 引用   

#22楼 2010-02-06 16:13 michael_fei      

兄弟,拨号后,对话号码若忙,是哪个状态呢,  回复 引用 查看   

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

These postings are provided "AS IS" with no warranties
and confer no rights.


Locations of visitors to this page

Blog Keywords
Embedded System,Visual Studio,.Net Framework,.Net Compact Framework,.Net Micro Framework,Windows Mobile,Windows Embedded CE,Emulator,WCF,CLR,Design & Pattern,C/C++,C#,Matlab,Algorithms
昵称:Freesc Huang
园龄:4年11个月
粉丝:32
关注:4

统计

  • 随笔 - 197
  • 文章 - 0
  • 评论 - 840

搜索

 

随笔分类(227)

随笔档案(197)

Blogs

Link

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜