黄季冬=>fox23

Freesc Huang & Smart Devices
数据加载中……
[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 阅读(1345) 评论(21)  编辑 收藏 网摘 所属分类: Compact Framework

评论

#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这个状态
    回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1102111




相关文章:

相关链接: