黄季冬=>fox23

Freesc Huang & Smart Devices
数据加载中……
[CF.Skills]在.NET Compact Framework中获取来电号码和屏蔽来电

一个人的情人节,老婆不在身边,只有写写代码解解闷了。
这是一个有趣的程序,厄,就是自动挂电话,情人节专门挂情人的电话,专心陪老婆,呵呵。
其中挂断电话主要用到了keybd_event这个本地方法

    public static class DropCall
    
{
        
private field

        
public fiield

获得来电号码用到了SystemState类和SystemProperty类

            挂载事件委托

我们利用蜂窝模拟器模拟来电

程序运行效果如下:


另外你可以设置一系列的不想接的电话,让程序替你挂断它们
比如

            初始化屏蔽号码名单
那么当你在Cellular Emulator中拨出号码13112132132后,模拟器会帮你挂断它
完成的程序点此处下载

PS:程序是基于.NET CF3.5的,如果要移植到CF2.0上可能还要稍做修改
PSS:您可能需要参考下列资料
Cellular Emulator的使用:
http://www.cnblogs.com/upto/archive/2007/02/14/cellular-emulater-in-wm6sdk.html
WM常用键值(VK)对应表:http://www.cnblogs.com/fox23/archive/2008/02/01/keyvalue.html
Lamda表达式:http://www.cnblogs.com/fox23/archive/2007/09/26/906581.html

posted on 2008-02-15 00:52 Freesc Huang 阅读(3164) 评论(66)  编辑 收藏 网摘 所属分类: Windows Mobile

评论

#1楼 2008-02-18 22:51 罗继锋[未注册用户]

你好,如果我想做一个拨打某个电话对方振铃两次我手机就自动挂断,要怎样做?谢谢!!能否能段代码。
    回复  引用    

#2楼[楼主] 2008-02-19 15:32 fox23      

@Kevinl
您好,据我所知,无法通过标准的方法,获知对方的手机振铃的次数。但是有可能实现获知呼叫方"嘟嘟"声的次数,比较直接的方式取决于您的手机音频路由是否支持modem的输出连接到Codec的录音输入ADC,这个时候才能够通过PCM等接口来将录音ADC的输出读取到CPU,才有可能通过WaveAPI这样的方式捕捉到回铃声的数据,您要想获得更多的信息请与手机生产商联系。另外一种间接的方式是记录拨打时间,由于嘟嘟声的频率每个国家是有统一标准的,您可以查阅一下相关时间标准,记录拨打时间。用上你的搜索引擎吧自己钻研吧,我帮不了你,钻研精神是一个程序员应该具备的素质。希望我的回答对您有帮助
:-)
    回复  引用  查看    

#3楼 2008-02-20 08:41 罗继锋[未注册用户]

非常感谢
    回复  引用    

#4楼 2008-03-10 14:51 下风      

你好!下载你的代码发现一点问题

void SS_Changed(object sender, ChangeEventArgs args)
{
try
{
if (DropCall.BannedList.Exists((s) =>
{
s = number;
return (from t in DropCall.BannedList
where t.Equals(s)
select t).Count() == 0 ? false : true;
}))
DropCall.Drop();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}
请问 s是不是没有定义啊? 还有这段代码if判断是不是没写全呢?
    回复  引用  查看    

#5楼[楼主] 2008-03-10 15:12 fox23      

程序是基于.NET CF3.5的,VS2008下编译通过,这段代码基于C#3.0...您可能需要先参考这里的几篇随笔先:
http://www.cnblogs.com/fox23/category/107697.html" target="_new">http://www.cnblogs.com/fox23/category/107697.html

Regards~
    回复  引用  查看    

#6楼 2008-03-11 17:01 罗继锋[未注册用户]

不好意思,还想问一个问题,我怎么检测到拨打电话时的接通消息?谢谢!!
    回复  引用    

#8楼[楼主] 2008-03-12 14:50 fox23      

    回复  引用  查看    

#9楼 2008-03-14 10:13 567fa.cn免费信息发布网[未注册用户]

谢谢,找了好久1
    回复  引用    

#10楼[楼主] 2008-03-14 10:19 fox23      

@567fa.cn免费信息发布网
多交流
    回复  引用  查看    

#11楼 2008-03-20 12:20 3月新手[未注册用户]

不好意思,請問在drop call後會有未接來電的通知,且missed call log內也會有被dorp的來電記錄,請問有沒有任何方法可以避免呢?謝謝!!
    回复  引用    

#12楼 2008-03-20 14:28 3月新手[未注册用户]

還有另一個問題,當程式在背景執行時似乎無法正常收到PhoneIncomingCall的event,請問我要如何在正常背景執行呢?謝謝!
    回复  引用    

#13楼 2008-03-20 14:43 3月新手[未注册用户]

喔,真糟糕,我發現在背景是可以正常執行的,剛剛是我自己的疏忽,抱歉抱歉!要怎麼刪除我的回帖呢
    回复  引用    

#14楼[楼主] 2008-03-20 15:25 fox23      

@3月新手
您好,不必删了,多多交流,
问问题可以来 http://winbile.net/bbs" target="_new">http://winbile.net/bbs
    回复  引用  查看    

#15楼 2008-03-21 12:10 罗继锋[未注册用户]

@fox23
感謝您的代碼。

還想請教一下(呵呵,問題還真多)。我看諾基亞的手機在打出去電話時,一撥號屏幕顯示正在撥號,噹聽到對方一振鈴的時候,螢幕上的圖標和下面的菜單都改變了,但是在PPC和Smartphone上面好象是沒變化的。是不是諾基亞手機在設計上做的手腳呢?

謝謝!!
    回复  引用    

#16楼[楼主] 2008-03-22 15:22 fox23      

@罗继锋
不是振铃的问题,是呼叫与接通(不是指通话,是建立连接)的问题
但这不是一个我们所谓Standard Feature的特征
PS:问问题欢迎来http://winbile.net/bbs" target="_new">http://winbile.net/bbs
    回复  引用  查看    

#17楼 2008-03-30 15:08 quantity[未注册用户]

你好,我想请教一个问题。就是我想在监听到来电信息的时候,改变系统的情景模式(例如响铃、振动),这样的功能在.NET CF 2.0下可以实现吗?
非常感谢!
    回复  引用    

#18楼[楼主] 2008-03-30 21:15 fox23      

您好,你的想法是可以实现的,不过您最好先看看WM6 SDK下的ringtonemanager例子,您可以在以下路径找到它:
??:\Program Files\Windows Mobile 6 SDK\Samples\Common\CS\RingtoneManager

Regards~
Freesc
    回复  引用  查看    

#19楼 2008-03-30 22:50 quantity[未注册用户]

我用的是WM5的SDK,有相应的内容吗?
还有,我能否获得系统收到短信或邮件的事件吗?

@fox23
    回复  引用    

#20楼[楼主] 2008-03-30 23:15 fox23      

@quantity
问题1:至少托管代码的Sample是没有的,您最好自己查阅一下
问题2:可以,参考MessageInterceptor类

PS:您说的情景模式貌似不只是铃声的问题吧...网上有些小工具的可以帮助你做模式切换的,您最好google一下

Good luck
    回复  引用  查看    

#21楼 2008-03-30 23:23 quantity[未注册用户]

@fox23
是这样的,我实际上就是想在响铃、振动、响铃+振动、静音之间自动切换,但是到底选择哪一种只能等到具体来电时才能确定,不知能否实现?
问题2,MessageInterceptor类是实现短信拦截的吧?我只是想得到最后一封短信或e-mail的属性(如发件人、e-mail地址、主题、内容等),这个类能实现吗?我知道判断是否收到新邮件,可以通过判断SystemState的MessagingSmsUnread属性的变化来得到吧?
    回复  引用    

#22楼[楼主] 2008-03-30 23:53 fox23      

@quantity
“能否实现”这样的问题您最好亲自尝试一下,我的回答是“肯定能实现".
“MessageInterceptor类是实现短信拦截的吧?"
-是,

"我知道判断是否收到新邮件,可以通过判断SystemState的MessagingSmsUnread属性的变化来得到吧?"
-不能,这个仅适用于SMS,微软没有提供枚举新邮件的托管接口,某些第三方的类库如Inthehand,OpenNETCF有所封装,你可以查阅以下。

欢迎来http://winbile.net/bbs" target="_new">http://winbile.net/bbs 讨论
    回复  引用  查看    

#23楼 2008-03-31 00:03 罗继锋[未注册用户]

还好意思,真的,我在http://winbile.net/bbs 这里提了,还是没人帮回答.只好再麻烦您了.您上面的代码想改成CF2.0要做哪些修改.刚学这东西.还知道该从哪下手.能帮改一份吗?先谢谢了.
    回复  引用    

#24楼 2008-03-31 00:04 quantity[未注册用户]

@fox23
谢谢!
我在winbile上发帖,ms没有回复:(
关于模式切换,其实我也知道肯定能实现,但实在不知道从何下手,项目催得也特别急,不知能否指个方向?
我并不是要做短信拦截,只是想获得新短信的事件,然后得到这条短信的对象,并记录其属性。我想要这条短信在收件箱里显示出来,所以我觉得不能用MessageInterceptor类吧?那应该用什么呢?
Inthehand我有所耳闻,现在就去看看。
再次感谢!
    回复  引用    

#25楼[楼主] 2008-03-31 11:01 fox23      

@quantity
您好,我已经回复你的帖子了。
MessgaInterceptor是对MAPI一个相对完整的封装,足够你的需求了。可以参考我朋友最近的文章:http://www.cnblogs.com/appleseeker/archive/2008/03/29/1129031.html
里面有示例,希望对你有所帮助~
    回复  引用  查看    

#26楼[楼主] 2008-03-31 11:24 fox23      

--引用--------------------------------------------------
罗继锋: 还好意思,真的,我在<a href="http://winbile.net/bbs" target="_new" rel="nofollow">http://winbile.net/bbs</a> 这里提了,还是没人帮回答.只好再麻烦您了.您上面的代码想改成CF2.0要做哪些修改.刚学这东西.还知道该从哪下手.能帮改一份吗?先谢谢了.
--------------------------------------------------------
您不要直接求代码,版规已经写的很清楚了。论坛只是讨论问题,相互交流的平台,不支持任何有偿或无偿的求源码或者代工,大家都很忙,不是每个人都有时间来帮别人写代码的。
原来的代码移植到CF2.0很简单,DropCall类不需要做任何改变,只需要将主窗体中,这一段:
if (DropCall.BannedList.Exists((s) =>
{
s = number;
return (from t in DropCall.BannedList
where t.Equals(s)
select t).Count() == 0 ? false : true;
}))
判断语句改为同样功能(判断号码是否在封禁名单中)的一个函数去完成就行了,如:
if(isBanned)
{
...
}
bool isBanned(string num)
{
//看num是否在BannedList中
}

就只有这里用到了C#3.0的两个特征:Lambda表达式和Linq,其他无需修改,别忘了把相关Linq
的引用去掉就行了。还有什么问题可以发邮件给我,最近实在比较忙,如果不能及时回复,还请见谅

Regards~
Freesc
    回复  引用  查看    

#27楼 2008-03-31 11:34 quantity[未注册用户]

@fox23
谢谢!我这里还有一个问题,我发现焦点不在当前窗体的时候是无法得到来电或拨出电话的事件的,有什么办法解决这个问题吗?因为我需要在任何时候都要得到这个消息,并且不影响用户任何的操作。
    回复  引用    

#28楼 2008-03-31 11:40 罗继锋[未注册用户]

@fox23
太感谢您在百忙之中抽时间给我的回复,我自己再努力看看。有问题再请教您。
    回复  引用    

#29楼[楼主] 2008-03-31 11:50 fox23      

@罗继锋
客气了,多多交流:)
    回复  引用  查看    

#30楼[楼主] 2008-03-31 11:53 fox23      

@quantity
兄弟,我也遇到了这个问题!请看这篇随笔:
http://www.cnblogs.com/fox23/archive/2008/03/12/phonestate1.html
最近比较忙,就暂时没有继续下去了。初步看来可能是任务优先级的问题,如果你有较好的解决方案别忘了告诉我!谢谢 :-)
    回复  引用  查看    

#31楼 2008-03-31 12:02 quantity[未注册用户]

@fox23
我看过这个,目前没想到什么好的解决方法啊。托管下不知道该怎么处理,如果要到底层去的话那我就疯了。。。
    回复  引用    

#32楼 2008-03-31 15:04 quantity[未注册用户]

@fox23
我现在也卡在这一步了,不知该怎么走下去……
    回复  引用    

#33楼 2008-03-31 15:53 quantity[未注册用户]

@fox23
还有一个问题,你那篇随笔中捕获来电号码的方法,是不是只能用一次?如果再来电话,就没用了吧?
    回复  引用    

#34楼[楼主] 2008-03-31 16:06 fox23      

@quantity
您好,我能问您一个问题吗?
什么是事件?

Regards,
Freesc
    回复  引用  查看    

#35楼 2008-03-31 17:59 quantity[未注册用户]

@fox23
呵呵,你问倒我了,我的确不清楚。一个状态的改变?或者一个属性的值的变化?
    回复  引用    

#36楼 2008-03-31 19:08 quantity[未注册用户]

@fox23
呵呵,我解决焦点不在窗口的问题了:使用持续通知。
调用SystemState.EnableApplicationLauncher()方法,参数是想要处理这个消息的应用程序
下面是我的代码:
private void Form1_Load(object sender, EventArgs e)
{
callState = new SystemState(Microsoft.WindowsMobile.Status.SystemProperty.PhoneCallTalking);
callCount = new SystemState(Microsoft.WindowsMobile.Status.SystemProperty.PhoneActiveCallCount);
outcallState = new SystemState(Microsoft.WindowsMobile.Status.SystemProperty.PhoneCallCalling);
callState.EnableApplicationLauncher("Form1");
callCount.EnableApplicationLauncher("Form1");
outcallState.EnableApplicationLauncher("Form1");
callState.Changed += new Microsoft.WindowsMobile.Status.ChangeEventHandler(callState_Changed);
callCount.Changed += new Microsoft.WindowsMobile.Status.ChangeEventHandler(callCount_Changed);
outcallState.Changed += new Microsoft.WindowsMobile.Status.ChangeEventHandler(outcallState_Changed);
}
    回复  引用    

#37楼[楼主] 2008-03-31 19:13 fox23      

Great! I'll try it later!
Thanks for posting the interesting code~

Freesc
    回复  引用  查看    

#38楼 2008-04-21 03:35 cokacora[未注册用户]

多谢fox23的文章,我在参考这里的代码写一小段自动应答指定电话号码的小程序,我的环境是VS2005+WM6.1SDK,出现一个问题,就是只能在调试时,进入那个判断号码的代码后才能正常执行那段模拟按键操作的程序,没有断点就不会执行,另外还会发生一个异常:
A first chance exception of type 'Microsoft.WindowsMobile.Utilities.Registry.RegistryException' occurred in Microsoft.WindowsMobile.Utilities.dll

Additional information: RegistryException

我只是改了DropCall.cs中按键的定义
private const int VK_F3 = 0x72;

并增加了一个方法判断号码是否在认可的号码List中
public static Boolean ExistInConfirmed(String numb)
{
Boolean ret = false;
if (ConfirmedList.IndexOf(numb) >= 0)
ret = true;

return ret;
}

在Form1.cs中,只是在SystemProperty.PhoneIncomingCallerNumber
这个事件处理中进行号码捕获和调用DropCall中的方法。

请问为什么我不能在非断点方式中截获来电号码呢?
为什么会有异常发生呢?
    回复  引用    

#39楼 2008-04-21 12:05 bobcy[未注册用户]

@cokacora
你说的设断点才能截获来电号码的原因估计是和手机的类型有关,某些机型只有在来电振铃2~3次后才能获取来电号码,某些机型不用等待振铃。你可以增加一个振铃计数,等振铃3次后再取来电号码。
    回复  引用    

#40楼 2008-04-26 04:41 yjgod[未注册用户]

您好,您的例子可以在wm5下执行吗?
想在wm5下用cf2.0做个监视电话事件的程序
:)
    回复  引用    

#41楼[楼主] 2008-04-26 08:28 fox23      

@yjgod
可以,部分代码稍加改动即可,见第26楼.

Freesc
    回复  引用  查看    

#42楼 2008-04-27 03:47 yjgod[未注册用户]

谢谢:)
另,有一个比较麻烦的问题
我想在.net中实现类似vb6的DDE的程序
现在的想法是自定义一个事件,然后通过程序自身的后来打开的实例将新的命令行参数通过事件调用的发式传给已经在执行的上一个实例。。但是不知道调用另一个程序的事件的方法。查了下关于这类的资料确实不多,也有可能是我查询的方法不对,所以来求教您啦
想在程序的执行过程中多次的接受命令行参数,像mediaplayer那样
再次感谢你的指点
:)
    回复  引用    

#43楼[楼主] 2008-04-27 09:10 fox23      

@yjgod
接受的参数在程序入口Main函数里面定义,eg:
static void Main(string[] args)
    回复  引用  查看    

#44楼 2008-04-28 00:22 yjgod[未注册用户]

@fox23
不是指这个,是指在程序的执行时接收命令行,比如media player正在播放的过程中,接收另外的命令行参数形式的播放请求
比如media player正在播放a.mp3,此时用户在资源管理器中双击b.mp3,则media player转而播放b.mp3(且没有打开新窗口)
    回复  引用    

#45楼[楼主] 2008-04-28 09:18 fox23      

@yjgod
您好,
WindowsCE的早期某些版本并不支持DDE.最好先查阅一下文档.不过对您说的情况,至少可以使用socket在进程间通信.



    回复  引用  查看    

#46楼 2008-04-28 15:26 yjgod[未注册用户]

能,试过用socket。。但是这样进程就必须时刻处于侦听的状态,有其他的办法吗?
比如通过触发需要通知的进程的事件。?
    回复  引用    

#47楼 2008-04-29 00:02 东方晓[未注册用户]

我有个两问题, !,此处的程序能在,WINCE 2006 上运行吧?际的,Sartphone 06手机,运行起来问题不大的吧?外请指明一下, 所用的什么开发环境.谢谢
2 如果像楼上所说,在,WINCE 2005 .net CF 2上运行的可能性也很大,那么,有没有人试过呢请指示,并请指明什么开发环境.
我看过的文档好像说,Smart Phone 2005 上,支持的打接电话,程序只能用TAPI实现 . 那么.CF 2是不是在, Smartphone 2005的真机上,能正常运行 些处所说的各种打接电话的功能呢.?

如果现开发,在所以版本的, 2003 .2005,2006 Smartphone 上运行的程序, 那么是不是要,安装分别独立的,系统, SDK,等呢?还有,各个版本的代码,也都要从头改写了,是吧.
    回复  引用    

#48楼[楼主] 2008-04-29 09:11 fox23      

@yjgod
你是使用C#吗?共享内存或者直接访问内存地址都比较麻烦,尽管网上有开源的DDE类库,但是在WinCE上是否可行我还没有验证过。
当然,你完全可以自己编写事件,但事件一旦订阅,要实现通知的过程仍然相当于进程上有一条(可定义为后台)线程处于侦听的状态。常见的方法是进程A通过获得进程B的窗体句柄给B发送消息,控制B程序
    回复  引用  查看    

#49楼[楼主] 2008-04-29 09:21 fox23      

--引用--------------------------------------------------
东方晓: 我有个两问题, !,此处的程序能在,WINCE 2006 上运行吧?际的,Sartphone 06手机,运行起来问题不大的吧?外请指明一下, 所用的什么开发环境.谢谢
@1WinCE 2006和Smartphone06是什么?
@2开发环境:VSTS2008+WM6
@3运行环境:WM5以及以上,须安装.NET CF3.5
2 如果像楼上所说,在,WINCE 2005 .net CF 2上运行的可能性也很大,那么,有没有人试过呢请指示,并请指明什么开发环境.
我看过的文档好像说,Smart Phone 2005 上,支持的打接电话,程序只能用TAPI实现 . 那么.CF 2是不是在, Smartphone 2005的真机上,能正常运行 些处所说的各种打接电话的功能呢.?
@文中提到所有功能在Dopods1 (WM6)测试和Samsung i718(WM5)测试通过。

如果现开发,在所以版本的, 2003 .2005,2006 Smartphone 上运行的程序, 那么是不是要,安装分别独立的,系统, SDK,等呢?还有,各个版本的代码,也都要从头改写了,是吧.

--------------------------------------------------------
    回复  引用  查看    

#50楼 2008-04-29 19:22 东方晓[未注册用户]

我真不知道,自己做,WINXP ,VS2005 .WM6 ,能不能测试运行这个例子, 等待中, 谢谢楼主, windows CE 是手机操作系统,  WM6的下载地址在哪, 我找了一个,  微软Windows Embedded CE 6.0官方网站:http://www.microsoft.com/windows/embedded/eval/wince/default.mspx
下载,感觉怪怪的, 不像你说的WM6. SMartphone 06 好像是,多普达出的, WM6的手机吧. 反正手机上面是这样写的呵呵, 我遇到高人了,真高兴.
    回复  引用    

#51楼 2008-04-30 01:33 yjgod[未注册用户]

@fox23
嗯,谢谢:)
我想是事件侦听的开销要小于tcp连接的侦听开销
向另一窗体发送消息是否需要使用invoke方法?
刚接触.net cf不久,还不是很了解一些细节上的东西:(
不过遇到高手真好:)
    回复  引用    

#52楼 2008-05-02 07:48 yjgod[未注册用户]

又来麻烦您了:)

是这样的:
写了如下代码:
Private swr As MessageInterceptor

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

swr = New MessageInterceptor(InterceptionAction.NotifyAndDelete, True)
AddHandler swr.MessageReceived, AddressOf SMSInterceptor_MessageReceived
End Sub

Private Sub SMSInterceptor_MessageReceived(ByVal sender As Object, ByVal e As MessageInterceptorEventArgs)
MsgBox("message received")
End Sub

在模拟器上完全正常,但放到wm6的真机上运行(jaq3),就无法进入SMSInterceptor_MessageReceived(),设置断点观察过。
拦截倒是拦截下来了,但没进入处理过程,真是奇怪的问题。
能指点一下吗?
    回复  引用    

#53楼 2008-05-15 21:34 quantity[未注册用户]

不好意思,我又来麻烦你了
是这样的,我能否在自己的程序里知道用户对本次来电采取的什么接听方式,就是按的是接听键,还是挂断键?在CF2.0下?
谢谢!
    回复  引用    

#54楼 2008-07-11 10:10 Jaguar_Jacky      

不知道能不能用程序直接控制AT命令!
    回复  引用  查看    

#55楼 2009-02-05 16:04 yjgod[未注册用户]

黄哥新年好!
我又来请教您了

想拦截wap push短信,可是使用MessageInterceptor无效。。
应该用哪种方式来获取到达的wap短信呢?
谢谢:)
    回复  引用    

#56楼[楼主] 2009-02-05 17:07 fox23      

@yjgod
您好,请参考SDK下的fileclient例子先:
Windows Mobile 6 SDK\Samples\Common\CPP\Win32\fileclient
    回复  引用  查看    

#57楼 2009-02-05 18:59 yjgod[未注册用户]

呃。。对c++不是很熟悉:(
    回复  引用    

#58楼 2009-02-05 19:10 yjgod[未注册用户]

有c#的实现方式吗?
    回复  引用    

#59楼 2009-02-06 21:44 yjgod[未注册用户]

呃。。黄哥。。能具体讲解一下push router的用法吗?
    回复  引用    

#60楼 2009-02-10 10:49 8710[未注册用户]

程序怎么运行在后台
    回复  引用    

#61楼 2009-02-13 16:57 GH_Yang[未注册用户]

来电信息中能看到自己的号码吗?
    回复  引用    

#62楼 2009-04-05 15:51 yjgod[未注册用户]

有办法获得拨出的电话号码吗?
    回复  引用    

#63楼[楼主] 2009-04-05 23:42 Freesc Huang      

@yjgod
试试SystemState.GetValue(SystemProperty.PhoneTalkingCallerNumber)
    回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1069059




相关文章:

相关链接: