易码技术论坛

 找回密码
 加入易码
搜索
查看: 1574|回复: 12

简单谈谈使用vb.net在.net cf中对于注册表的一些操作。

[复制链接]
发表于 2009-8-26 14:14:24 | 显示全部楼层 |阅读模式
偶尔唰一下都在水区,不是水区有个帖子说改版了,我还不知道来着。
既然改版了,我还是支持一下吧,发一发在m8的sdk还没有出来的时候研究.net CF的一点资料。最早发在m8 fans,不过当时没人理,后来出了SDK .net cf就更没人研究了。


ce系统的编程资料很少,并且大都是基于evc和c#开发的。当然c#的代码,我可以参考他对于.net cf的一些类库的使用,这些是一样的,但是何奈资料的确不多。并且在m8这个用户和爱好者圈子来看,并没有很多喜欢编程自制软件的朋友在这里,只有寥寥几位,而且都是各自为战。我曾向一位m8的自制软件作者和扒饭的一位管理员索取过开发资料,可惜不是没有回应,就是告知没有。在官方论坛所发的帖子更是一发出去就被版主放到综合区,1分钟没有我一刷新就石沉大海不见了。还有当时准备写一个基于.net cf的注册表编辑器,但是官方论坛的版主非常不客气的告诉我没必要整这个,wm的几个编辑器虽然不能全屏使用,但是可以用,要我等着SDK出来再做点有用的东西吧。我这个人意志力不太坚定,既然版主说了不需要这些东西,所以后来就放弃了继续弄.NET CF,发一些以前总结的东西吧。

我使用的vs2008.net编程的语言是vb,基于的ce6.0系统和.net cf。

由于这段时间以来都研究了一下win ce的注册表,所以就说说注册表的相关操作吧。

和pc上的系统一样,在windows ce系统中,系统信息也是存储在称为注册表中的,所以有关m8的真实配置信息,都可以在注册表中找到。

注册表是按照子树(根项)、子树的项、子项和值项的层次结构组织的。注册表项可有子项,同样子项也可有子项。注册表中的大多数信息都是被永久保存的,但是某些子项中的一些信息,在每次系统启动时都会被清空或者覆盖。而且根据我查到的资料,在ce系统的以前版本中规定的最大子项深度为15级。当然ce6.0是否支持更多我就不清楚,这需要有机器的朋友实际测试。

根据资料,ce系统包括wm系统有4个根项。

分别是

HKEY_LOCAL_MACHINE:这里包含关于本地计算机系统的信息,包括硬件和操作系统数据,如总线类型、系统内存、设备驱动程序和启动控制数据等等。

HKEY_CLASSES_ROOT:包含用于各种OLE技术和文件类关联数据的信息。

HKEY_CURRENT_USER:包含当前登录的用户的用户配置文件,包括环境变量、桌面设置、网络连接、打印机和程序首选项。

HKEY_USERS:包含关于动态加载的用户配置文件和默认配置文件的信息。

在.net cf中,Microsoft.Win32命名空间提供处理操作系统注册表的类和对象。

分别是

Registry:提供表示Windows注册表中的根项的RegistryKey对象,并提供访问项/值对的static方法

RegistryKey:表示Windows注册表中的项级节点。此类是注册表封装

RegistryKeyPermissionCheck:指定在打开注册表项并访问它们的名称/值对时是否执行安全检查

RegistryValueKind:指定在注册表中存储值时所用的数据类型,或标识注册表中某个值的数据类型

大家可以在msdn中详细查看它们的方法和属性。

利用他们,我们可以实现对ce系统注册表的操作。

比如查看注册表的根项和子项。

我们先建立一个module,在最顶层写上Imports Microsoft.Win32

在它的代码里写上这些代码

   Public subkeys1 As RegistryKey = Registry.LocalMachine
   Public subkeys2 As RegistryKey = Registry.ClassesRoot
   Public subkeys3 As RegistryKey = Registry.CurrentUser
   Public subkeys4 As RegistryKey = Registry.Users

这样4个共有变量以便于以后我们可以方便的调用。

再在form窗口里添加一个treeiew,命名为treeiew1.并为它添加HKEY_LOCAL_MACHINE,HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_USERS  4个根结点。

然后在form窗口代码中添加以下内容

       TreeView1.BeginUpdate()
       Dim subKeyName As String
       Dim keynames As String() = subkeys1.GetSubKeyNames()
       For Each subKeyName In keynames
           TreeView1.Nodes(0).Nodes.Add(subKeyName)
       Next
       subkeys1.Close()

       keynames = subkeys2.GetSubKeyNames()
       For Each subKeyName In keynames
           TreeView1.Nodes(1).Nodes.Add(subKeyName)
       Next
       subkeys2.Close()

       keynames = subkeys3.GetSubKeyNames()
       For Each subKeyName In keynames
           TreeView1.Nodes(2).Nodes.Add(subKeyName)
       Next
       subkeys3.Close()

       keynames = subkeys4.GetSubKeyNames()
       For Each subKeyName In keynames
           TreeView1.Nodes(3).Nodes.Add(subKeyName)
       Next
       subkeys4.Close()

       TreeView1.EndUpdate()

这样当你运行调试的时候,程序就自动将这4个注册表根项的子项添加到treeiew的4个根节点所对应的子节点上。

如果我们要创建创建注册表子项,如在 HKEY_CURRENT_USER 下创建一个名为 123 的子项

我们可以这样写

Dim 123 As Microsoft.Win32.RegistryKey

123 = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("123")

如果要在123 下再创建两个子项,那么继续添加如下代码

123.CreateSubKey("111").Close()

Dim 456 As Microsoft.Win32.RegistryKey

456 = 123.CreateSubKey("456")

456.Close()

123.Close()

如果我们要读取读取注册表子项的话。可使用RegistryKey类的GetSubKey Names方法实现,代码如下。

Dim subKeyName As String

Dim subkeys As Microsoft.Win32.RegistryKey

subkeys  = Microsoft.Win32.Registry.CurrentUser

Dim keynames As String()

keynames  = subkeys.GetSubKeyNames()

For Each subKeyName In keynames

   MsgBox(subKeyName)

Next

subkeys.Close()

以上操作是读取CurrentUser根项中所有子项并以消息框方式弹出显示。

如果我们要创建注册表值项,我们可以这样写

Dim 123 As Microsoft.Win32.RegistryKey

123 = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("123")

Dim regvalue() As String = {"One", "Two", "Three"}

123 .SetValue("注册表添加标值Test", regvalue)

123 .SetValue("你", "我")

123 .SetValue("你们", "我们")

123 .SetValue("meizu", "m8")

123.Close()

前面的你,你们,meizu,为值项名,后面的我,我们,m8为它们的值

而读取注册表值项,我们可以这样写。

Dim valueName As String

Dim subkeys As Microsoft.Win32.RegistryKey

subkeys  = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("123")

Dim keyvalues As String() = subkeys.GetValueNames()

For Each valueName In keyvalues

   MsgBox(valueName & "=" & subkeys.GetValue(valueName).ToString())

Next

subkeys.Close()

如果要删除子项,那么代码如下:

假设子项名为先前建立的 123

Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree("123")

更下级子项以\作为分隔符,如

Microsoft.Win32.Registry.CurrentUser.DeleteSubKey("123\456")

依此类推。

而删除注册表值项的代码为

假设要删除的值相名为先前建立的meizu

Dim 123As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("123")

123.DeleteValue("meizu")

123.Close()


首先我们确认这个值项所在的地址为CurrentUser\123,然后使用DeleteValue方法,可以方便的删除。

ok,大致的注册表操作,我都给出了,可以看到利用强大的RegistryKey 类,我们完全可以写出m8原生的注册表编辑器。而且编辑器说能使用的注册表操作和treeiew控件我都给出了简单的示例。只要稍微再深入研究一下就可以写出来了。并且由.net cf编译出来的程序,一般来说也可以在安装了.net framework的pc上使用的。

我本来是打算写个原生的m8注册表编辑器的。不过既然有官网的版主说不需要这个东西,所以也不准备写了。不过既然花了几天时间来研究注册表的操作,那还是把研究成果公布一下吧。根据我这篇文章的信息,再稍微参考一下msdn的部分说明和实例,可以很快的开发出m8原生的注册表编辑。

另外:当程序在一组子项中保存或检索大量注册表设置时,会执行许多冗余安全检查。可以通过RegistryKeyPermissionCheck枚举对象指定何时忽略对子项执行的安全检查以提高程序效率。并且,注册表的有多种数据类型,设置注册表项的值时,应该使用SetValue方法显式地指定注册表数据类型。检索和显示注册表项的值时,应该先使用GetValueKind方法检查注册表数据类型。
相关操作我就不再写出来了,相比前面的操作之下还是蛮简单的。大家可以自行研究msdn中的帮助。

这里主要特别主意的是

ce系统属于单用户操作系统,因此不存在对Pocket PC设备用户进行访问权限的设置。

在ce系统中,系统配置信息集中在注册表中。所以对注册表编辑是比较危险的操作。如果无意间修改了重要的系统数据,有可能使操作系统崩溃,只有重唰rom才能恢复,所以在编辑不认识的子建和键值前一定要主义备份自己的重要数据。

以上文章的部分操作和代码,参考了.NET CF移动开发指南一书,特此声明。
 楼主| 发表于 2009-8-26 14:16:24 | 显示全部楼层
还有这个我也研究过,貌似我每次都研究的是已有的功能和工具……………………………………

在.net cf中看到有趣的类,应该可以实现自制电话黑名单。

SystemState类和SystemProperty类
dim state = new SystemState(SystemProperty.PhoneIncomingCallerNumber);
dim SS = new SystemState(SystemProperty.PhoneIncomingCall);
SS.Changed += new ChangeEventHandler(SS_Changed);
state.Changed += new ChangeEventHandler(state_Changed);
以上是VB的代码。类的使用其实都差不多,我也不懂c#,看看知道意思就行了。
这段代码应该可以获取来电号码。
如果把需要屏蔽的号码存储起来,等来电的时候用上面的类获取来电号码,再进行条件判断。
若其来电号码=本机保存的黑名单中号码,再模拟一次挂断的按键操作应该就可以实现。
要实现这个程序需要m8的挂断的按键值是多少

这是利用SystemState类和SystemProperty类在VB.NET中实现获取来电号码的代码段。类的使用都是一样。熟悉.net编程的朋友应该能看懂。

SystemState是Microsoft.WindowsMobile.Status(Microsoft.WindowsMobile.Status.dll)命名空间中有2个主要类之一主要用于收集和监视系统的很多状态信息,包括日历、邮件、电话、同步、电源等。

SystemProperty也是Microsoft.WindowsMobile.Status(Microsoft.WindowsMobile.Status.dll)命名空间类的一个枚举类是SystemState中用于监视的所有信息。


来电防火墙程序的基本实现思想我已经给出来了。获取来电号码的例子也写好了。如果是c#编程的朋友稍微改改变量定义就可以直接使用这段代码获取来电号码了。

事实上这2个类很强大的,可以实现很多功能……我也没有仔细研究,希望有兴趣的朋友继续研究下去。
发表于 2009-8-26 23:05:54 | 显示全部楼层
赞小A~ 话说小A现在用啥手机? iphone?
 楼主| 发表于 2009-8-27 01:31:39 | 显示全部楼层
nokia 6220c
这边手机很贵,我本来打算买HTC touch pro的,但是这边算下来要8000多人民币,只有算了。就6220c我都买成2200多人民币


话说既然转型做移动设备,那啥干脆也开个iphone和symbian专区吧
发表于 2009-8-27 01:34:58 | 显示全部楼层
X1 2850路过
发表于 2009-8-27 09:41:46 | 显示全部楼层
不喜欢VB的路过
我用.NET基本上用C#
发表于 2009-8-27 11:13:43 | 显示全部楼层

回复 4# 的帖子

囧, 6220c国内大概不到1k5吧
用iphone的人不多, 而用symbian还愿意搞开发的也不多..
发表于 2009-8-27 12:16:43 | 显示全部楼层
不用重刷,M8重置注册表就好(M键+电源开机)
WM自从WM5以后,注册表就坏不掉了,系统正常关机时会备份注册表
 楼主| 发表于 2009-8-27 15:42:50 | 显示全部楼层
其实是一眼的,都是类的调用而已,换一点变量的定义符号c#也一眼用
发表于 2009-8-28 00:16:51 | 显示全部楼层
一眼是一样的方言说法么?
 楼主| 发表于 2009-8-28 01:20:59 | 显示全部楼层
原帖由 FantasyDR 于 2009-8-28 00:16 发表
一眼是一样的方言说法么?



是qq拼音这个地区的方言,因为说话太快到时发音不清
发表于 2009-8-28 08:17:14 | 显示全部楼层
都是一样儿一样儿的
发表于 2009-8-28 17:57:28 | 显示全部楼层
看的好晕...............
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 04:03 , Processed in 0.010358 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表