用C#操作类读写WinCE平台Mac地址

简介:          前段时间在测试我们触摸屏联网性能的时候,由于屏的Mac地址通过注册表设置,而PB定制WinCE内核的时候就有一个默认值,所以一批下来Mac地址都一样,两台以上的机器一联网准出问题,通过注册表软件去修改Mac地址太麻烦了,所以做了一个小的Mac地址软件。

         前段时间在测试我们触摸屏联网性能的时候,由于屏的Mac地址通过注册表设置,而PB定制WinCE内核的时候就有一个默认值,所以一批下来Mac地址都一样,两台以上的机器一联网准出问题,通过注册表软件去修改Mac地址太麻烦了,所以做了一个小的Mac地址软件。

以前用VB做了一个注册表操作类(参见我的blog: http://blog.csdn.net/yefanqiu/archive/2004/07/13/40379.aspx),功能比较详尽;现在用C#做了一个注册表操作类也别简单的只做数据读写了,索性也做个全功能的了。由于.Net在域名空间Microsoft.Win32中提供 RegistryKey类,操作注册表还是比较方便的,唯感不足的时在操作多级子键的时候不很便捷,所以在封装注册表操作类的时候也把这部分内容给考虑进去了。
注册表操作类代码(可以用在 .Net精简框架集下)如下:
/// <summary>
/// 注册表操作类 -- 叶帆工作室
/// </summary>
public class YFReg
{
    public enum HKEY { HKEY_LOCAL_MACHINE = 0, HKEY_CLASSES_ROOT = 1, HKEY_CURRENT_USER = 2, HKEY_USERS = 3 };
    private RegistryKey[] reg = new RegistryKey[4];
 
    public YFReg()
    {
        reg[(int)HKEY.HKEY_LOCAL_MACHINE] = Registry.LocalMachine;
        reg[(int)HKEY.HKEY_CLASSES_ROOT] = Registry.ClassesRoot;
        reg[(int)HKEY.HKEY_CURRENT_USER] = Registry.CurrentUser;
        reg[(int)HKEY.HKEY_USERS] = Registry.Users;
    }
 
    // 读指定变量值
    public string ReadValue(HKEY Root,string SubKey,string ValueName)
    {
        RegistryKey subKey=reg[(int)Root];
        if (ValueName.Length == 0) return "[ERROR]";
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            string strKey = subKey.GetValue(ValueName).ToString();
            subKey.Close();
            return strKey;
        }
        catch
        {
            return "[ERROR]";
        }
    }
 
    // 读指定变量的类型
    public RegistryValueKind ReadValueType(HKEY Root, string SubKey, string ValueName)
    {
        RegistryKey subKey = reg[(int)Root];
        if (ValueName.Length == 0) return RegistryValueKind.Unknown;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            RegistryValueKind valueType = subKey.GetValueKind(ValueName);               
            subKey.Close();
            return valueType;
        }
        catch
        {
            return RegistryValueKind.Unknown;
        }
    }
 
    // 写指定变量值
    public int WriteValue(HKEY Root, string SubKey, string ValueName, string ValueData)
    {
        return WriteValue(Root, SubKey, ValueName, ValueData, RegistryValueKind.String); 
    }
   
    // 写指定变量值
    public int WriteValue(HKEY Root, string SubKey, string ValueName,object ValueData,RegistryValueKind ValueType)
    {
        RegistryKey subKey = reg[(int)Root];
        if (ValueName.Length == 0) return 2;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
               {
                    subKey = subKey.CreateSubKey(strKeyName);
                }
            }
            subKey.SetValue(ValueName, ValueData, ValueType);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    // 删除指定变量
    public int DeleteValue(HKEY Root, string SubKey, string ValueName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName,true);
                }
            }
            subKey.DeleteValue(ValueName, true);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    // 创建指定的键
    public int CreateKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        if (KeyName.Length == 0) return 2;
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.CreateSubKey(strKeyName);
                }
            }
            subKey.CreateSubKey(KeyName);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    // 删除指定的键
    public int DeleteKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName, true);
                }
            }
            subKey.DeleteSubKeyTree(KeyName);
            subKey.Close();
            return 0;
        }
        catch
        {
            return 1;
        }
    }
 
    // 判断指定的键是否存在
    public int IsExistKey(HKEY Root, string SubKey, string KeyName)
    {
        RegistryKey subKey = reg[(int)Root];
        try
        {
            if (SubKey.Length > 0)
            {
                string[] strSubKey = SubKey.Split('//');
                foreach (string strKeyName in strSubKey)
                {
                    subKey = subKey.OpenSubKey(strKeyName);
                }
            }
            string[] strSubKey1 = subKey.GetSubKeyNames();
            foreach (string strKeyName in strSubKey1)
            {
                if (strKeyName == KeyName) return 0;
            }
            return 1;
        }
        catch
        {
            return 2;
        }
    }
 
    // 枚举指定的键的子键
    public string[] EnumKeyName(HKEY Root, string SubKey)
    {           
        RegistryKey subKey = reg[(int)Root];
        if (SubKey.Length == 0) return null;
        try
        {
            string[] strSubKey = SubKey.Split('//');
            foreach (string strKeyName in strSubKey)
            {
                subKey = subKey.OpenSubKey(strKeyName);
            }
            string[] strKey = subKey.GetSubKeyNames();
            subKey.Close();
            return strKey;
        }
        catch
        {
            return null;
        }
    }
   
    // 枚举指定的键的值
    public string[] EnumValueName(HKEY Root, string SubKey)
    {
        RegistryKey subKey = reg[(int)Root];
        if (SubKey.Length == 0) return null;
        try
        {
            string[] strSubKey = SubKey.Split('//');
            foreach (string strKeyName in strSubKey)
            {
                subKey = subKey.OpenSubKey(strKeyName);
            }
            string[] strValue = subKey.GetValueNames();
            subKey.Close();
            return strValue;
        }
        catch
        {
            return null;
        }
    }
}
类出来了,用它读写 Mac地址就是小菜一碟了,下面是读写Mac地址的示例代码:
private void btnRead_Click(object sender, EventArgs e)
{
    txtMAC1.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress0");
    txtMAC2.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress1");
    txtMAC3.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress2");
    txtMAC4.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress3");
    txtMAC5.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress4");
    txtMAC6.Text = reg.ReadValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress5");
}
 
private void btnWrite_Click(object sender, EventArgs e)
{
    int intRet = 0;
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress0", txtMAC1.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress1", txtMAC2.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress2", txtMAC3.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress3", txtMAC4.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress4", txtMAC5.Text);
    intRet += reg.WriteValue(YFReg.HKEY.HKEY_LOCAL_MACHINE, @"Comm/DM9CE1/Parms", "SoftwareMacAddress5", txtMAC6.Text);
    if (intRet > 0)
    {
        MessageBox.Show(" 更改失败" );
    }
}
相关文章
|
数据库 Docker 容器
Mac 下Docker操作SQLServer数据库
Mac 下Docker操作SQLServer数据库
168 0
|
11月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
NoSQL Shell MongoDB
Mac OSX 平台安装 MongoDB
10月更文挑战第11天
394 4
|
存储 网络协议 安全
IP地址、MAC地址、互联网、WLAN、运营商、子网掩码、网络地址、网段、网关、集线器、光纤、基站
IP地址、MAC地址、互联网、WLAN、运营商、子网掩码、网络地址、网段、网关、集线器、光纤、基站
733 0
|
缓存 网络协议 网络架构
以太网数据链路层、Ethernet_II帧格式、IEEE802.3帧格式,以太网的MAC地址的组成,ARP地址解析协议的工作原理,单播帧、组播帧、广播帧的区别
数据链路层,Ethernet_II帧格式、IEEE802.3帧格式,帧格式的区分以及链路层每种帧格式有什么作用,怎么区别分辨帧格式,以太网MAC地址的组成,ARP地址解析协议原理、什么是单播帧?什么是组播数据帧?什么是广播帧?...............
1735 0
以太网数据链路层、Ethernet_II帧格式、IEEE802.3帧格式,以太网的MAC地址的组成,ARP地址解析协议的工作原理,单播帧、组播帧、广播帧的区别
|
数据安全/隐私保护
Mac平台出现brew command not found问题解决方法
Mac平台出现brew command not found问题解决方法
2634 1
|
Linux Shell 开发工具
Git 安装和配置教程:Windows - Mac - Linux 三平台详细图文教程,带你一次性搞 Git 环境
Git是一款免费、开源的分布式版本控制系统,广泛应用于软件开发领域。随着开源和云计算的发展,Git已经成为了开发者必备的工具之一。本文将为大家介绍Git在Windows、Mac和Linux三个平台上的安装和配置方法,带你一次性搞定Git环境
4467 0
|
设计模式 测试技术 开发工具
Git操作指南: 企业级项目分支管理流程 - SourceTree Mac 版(1)
发现每到一家公司,公司的管理流程都差距甚远,大的互联网公司注重细节和内部实现,代码质量要求简直就是苛刻,新员工&lt;review code + 导师 &gt;是少不了的,每写一行代码,非得说清楚里面原理是什么?为什么要这样写,是不是用啥设计模式会更有拓展性一点,业务文档和技术文档也是强制性的,各种流程像流水线办公类似,一个细节出问题,影响的就是整个发版,复杂的需求可以划分为多个需求id,然后每个人只负责自己的小需求模块即可,小团队的话则更注重整体业务把握,基本上搞透一个点,做着做着就得梳理之前的业务流程,刚好国庆挤了点时间把git总结了一下,然后再逐步分析一下企业真实的git管理是怎么样的,希望对职场的
767 0
Git操作指南: 企业级项目分支管理流程 - SourceTree Mac 版(1)
|
Linux 数据处理 开发者
R语言如何快速安装R包?常见方法与报错解决方案汇总,适用于Windows、Mac、Linux多平台
R语言如何快速安装R包?常见方法与报错解决方案汇总,适用于Windows、Mac、Linux多平台
|
存储 Web App开发 缓存
2023mac平台知名系统清理应用CleanMyMac
mac平台的知名系统清理应用CleanMyMac在经历了一段时间的测试后,全新设计的X正式上线。与CleanMyMac3相比,新版本的UI设计焕然一新,采用了完全不同的风格。使用Windows电脑时,很多人会下载各类优化软件,而在Mac平台中,CleanMyMac就是一款适合大多数人的App
346 0