wm手机开机自运行程序实例--Sim卡识别程序_ygysoft`s workroom_百度空间

摘自:

现在,好多人都开始使用Windows Phone了,其提供了个人信息管理功能十分强大,无奈的是,如果当我们过分依赖于这些辅助功能,那么一旦设备丢失或被盗(结果一样吧,哈哈),个人信息将遗漏无疑啊。所以,为了保护我们的个人信息,在这里写一个Sim卡识别程序,如果是非本人的SIM卡插入,则删除本机的相关个人信息,以防被盗!

首先,如何识别我们的Sim卡呢?它有一组20位(也许吧)的识别码,应该是比较全球{wy}吧。而怎么去获得这个ID呢?这里用到一个P/V invoke技术,实际上就是使用cellcore.dll的Sim卡功能类SimInitialize等,用这些功能读出插在手机中的SIM卡的ID。

其次,应该在何种场合进行判断呢?其实大家因该有这种经验:WM的PPC一般不会关机,除非换电池和SIM卡。所以,我们的程序需要在机器开机的时候运行,而且{zh0}不要有什么用户界面,所以,我选择新建一个智能设备的控制台项目,作为我们的开发环境。

当然,还是选用.net cf 2.0的环境,模拟器么,选择WM6吧。

至此,我们已经建立起一个项目,下面我们需要往其中加入代码,其中,核心代码如下:

SIM类
using System;

using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace SmartDeviceProject1
{
    
public class SIM
     {

        
#region 平台调用
         [DllImport(
"cellcore.dll")]
        
public extern static int SimInitialize(int dwFlags, IntPtr lpfnCallback, int dwParam, ref IntPtr lphSim);

         [DllImport(
"cellcore.dll")]
        
public extern static int SimDeinitialize(IntPtr hSim);

         [DllImport(
"cellcore.dll")]
        
public extern static int SimReadRecord(IntPtr hSim, int dwAddress, int dwRecordType, int dwIndex, byte[] lpData, int dwBufferSize, ref int dwSize);

        
int EF_ICCID = 0x2fe2;
        
int SIM_RECORDTYPE_TRANSPARENT = 1;
        
#endregion
        
        
//返回Sim卡背面的20位ICCID
        public string SimSerialNumber()
         {
             IntPtr hSim
= default(IntPtr);
            
byte[] iccid = new byte[10];
            
int dwsize = 0;
             SimInitialize(
0, IntPtr.Zero, 0, ref hSim);
             SimReadRecord(hSim, EF_ICCID, SIM_RECORDTYPE_TRANSPARENT,
0, iccid, iccid.Length, ref dwsize);//在这里获取了SIM卡ID
             SimDeinitialize(hSim);
            
return FormatAsSimString(iccid);
         }
        
/// <summary>
        
/// 对 SIM卡ID进行格式化
        
/// </summary>
        
/// <param name="iccid">byte格式的ID</param>
        
/// <returns>字符串格式</returns>
        private static string FormatAsSimString(byte[] iccid)
         {
            
string rawString = GetRawIccIDString(iccid);
            
return String.Format("{0} {1} {2} {3}", rawString.Substring(0, 6), rawString.Substring(6, 5), rawString.Substring(11, 4), rawString.Substring(15, 4));
         }
        
/// <summary>
        
/// 格式转换函数
        
/// </summary>
        
/// <param name="iccid"></param>
        
/// <returns></returns>
        private static string GetRawIccIDString(byte[] iccid)
         {
             System.Text.StringBuilder builder
= new System.Text.StringBuilder();
            
int i = 0;
            
while (i < iccid.Length)
             {
                
byte b = iccid[i];
                 builder.Append(ConvertInt4PairToString(b));
                 Math.Max(System.Threading.Interlocked.Increment(
ref i), i - 1);
             }
            
return builder.ToString();
         }

        
private static string ConvertInt4PairToString(byte byteValue)
         {
            
return ((byte)(byteValue << 4) | (byteValue >> 4)).ToString("x2");
         }

        

     }
}

核心代码我们有了,大家应该通过查资料和注释大概能理解程序要做的事情了吧,其实很简单,对不对?好,下一步我们在Programs.cs中添加功能调用代码如下:

Main
using System;

using Microsoft.WindowsMobile.PocketOutlook;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using Microsoft.VisualBasic;

namespace SmartDeviceProject1
{
    
class Program
     {
        
        
static void Main(string[] args)
         {
             SIM card
= new SIM();
            
//获取注册表
             RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\\TEST", true);
            
if ((reg == null))
             {
                 reg
= Registry.LocalMachine.CreateSubKey("SOFTWARE\\TEST");//如果为空则添加一个键值
               
             }

            
if (reg.GetValue("sim")==null)
             {
                
if (Interaction.MsgBox("是否设定当Sim CardID不符时,自动发送短信", MsgBoxStyle.OkCancel,"提示") == MsgBoxResult.Ok)
                 {

                     reg.SetValue(
"sim", card.SimSerialNumber());
                 }
             }
            
else
             {
                
if (reg.GetValue("sim").ToString() != card.SimSerialNumber())
                 {
                     OutlookSession Session
= new OutlookSession();
                    
//删除所有联系人
                     Session.Contacts.Items.Clear();
                    
//删除所有约会
                     Session.Appointments.Items.Clear();
                    
//删除所有工作计划
                     Session.Tasks.Items.Clear();
                    
                     Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms
= new Microsoft.WindowsMobile.PocketOutlook.SmsMessage();
                     sms.Body
= card.SimSerialNumber();
                    
//发一封短信到自己的手机,內容包含目前sim iccid
                     sms.To.Add(new Recipient("1234"));
                     sms.Send();
                 }
                
else
                 {
                     reg.Close();
                     Microsoft.WindowsMobile.PocketOutlook.SmsMessage sms
= new Microsoft.WindowsMobile.PocketOutlook.SmsMessage();
                     sms.Body
= card.SimSerialNumber();
                     sms.To.Add(
new Recipient("1234"));
                     sms.Send();
                     Interaction.MsgBox(
"欢迎回来,主人!", MsgBoxStyle.OkCancel, "提示");
                 }
                
             }


         }
        

     }
}

话说至此程序已经完成,我们还需设置项目的生成属性,其中:

输出文件夹为:Start Menu Startup文件夹,子目录为空,Ok.

下面我们就点击调试吧,系统打开WM6 Professional的模拟器,然后自动运行程序,会显示如下画面:

我们点击确定,之后,新建一个联系人

软启动设备,直至系统进入桌面,我们并没有看到什么提示,但是看看我们的Cellular Emulator,它是不是收到一条短信啊:

呵呵,再看看联系人一览:

哈哈~~~~

到此,整个程序就完成了。当然,还可以发挥你的想象力,加入更牛A的操作,这就看你了,{zh1}弱弱的温馨提示一句:真机调试本程序前,{zh0}备份好你自己的联系人等信息,造成的任何意外损害,我概不负责啊~~~~~

参考文档

AppleSeeker的系列文章,很不错啊
这里是一个相关讨论,大家也可以看看



郑重声明:资讯 【wm手机开机自运行程序实例--Sim卡识别程序_ygysoft`s workroom_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——