前序:
在设置了机主信息后,每当开机或设备闲置一段时间重新使用后都会首先在屏幕上显示信息。PPC中在”Setting – Personal - Owner Information”中设置,SP在”Setting – More - Owner Information”中设置。
SP中显示的个人信息有:Name, Telephone, E-mail,
Notes
PPC中显示的个人信息有Name, Company, Address, Telephone, E-mail, Notes
如何获取和设置机主信息呢?
我们在PPC和SP的注册表项:[HKEY_CURRENT_USER\ControlPanel\Owner]中都找到了机主信息的对应键。
在SP中我们找到了该键的4个项,分别为: Name,Telephone, E-mail, Notes,分别存储了上述的SP中的信息四项信息。
在PPC中我们找到了6项,Name, Telephone, E-mail,
Notes, Owner, Owner Notes,其中Name, Telephone,
E-mail, Notes和SP中存储了信息一样。但是我们发现Owner和Owner Notes中存储了更多的信息,其中:“Owner”对应的键值中存储了640字节的二进制信息,包括了Name, Company, Address,Telephone, E-mail中所有的信息;“Owner Notes”对应的键值中存储了388字节的二进制信息,包含了Notes信息。
一 PPC
我们以PPC为例做详细介绍。
注意:
1. 如果您初次使用该设备并且从没有启动过Owner Information设置程序,那么注册表中是没有该项的。当您第一次启动Owner Information设置程序后,注册表项就会被自动添加了。因此,在获取注册表键值信息前一定要判断该项是否存在,以免造成由于查找不到而造成的异常。
2. 需要知道Owner Information各个字段属性的字节限制。如何知道各个属性的字节限制呢,很简单,直接读取数据,然后单步调试,在调试窗口就可以看到了^_^
您还需要注意,这里存储的都是Unicode字符,因此无论是汉字、字母还是其他字符,每个字符都占2个byte,也就一个字(word)。
如下:
Owner: 总 640 bytes
在获取时需要根据字节偏移量来获取
Name: 72 bytes (跟踪调试,最多只能添加35个字符,即70个字节,其余的填充为0)
Company: 72 bytes (跟踪调试,最多只能添加35个字符,即70个字节,其余的填充为0)
Address:
372 bytes (跟踪调试,最多只能添加128个字符,即256个字节,其余的填充为0)
Phone:
50 bytes (跟踪调试,最多只能添加24个字符,即48个字节,其余的填充为0)
Email:
74 bytes (跟踪调试,最多只能添加35个字符,即70个字节,其余的填充为0)
Owner Notes: 总 388 bytes
(跟踪调试,最多只能添加192个字符,即384个字节,其余的填充为0)
代码如下:
1. 读取数据
{
name = UnicodeEncoding.Unicode.GetString(data, 0, 72).TrimEnd('\0');
company = UnicodeEncoding.Unicode.GetString(data, 72, 72).TrimEnd('\0');
address = UnicodeEncoding.Unicode.GetString(data, 144, 372).TrimEnd('\0');
phone = UnicodeEncoding.Unicode.GetString(data, 516, 48).TrimEnd('\0');
email = UnicodeEncoding.Unicode.GetString(data, 566, 74).TrimEnd('\0');
}
// 获取 "Owner Notes" 值
data = key.GetValue("Owner Notes") as byte[];
if (data != null)
{
notes = UnicodeEncoding.Unicode.GetString(data, 0, data.Length).TrimEnd('\0');
}
2. 写数据
在写数据时我们需要注意两点:
2. 一定要将OpenSubKey的第二个参数设置为true,否则将写入失败(不具有写的权限)。
{
key = Registry.CurrentUser.CreateSubKey("ControlPanel\\Owner");
if (key == null)
{
throw new InvalidOperationException("Write owner information failed
}
}
// 设置 "Owner" 值
char[] szOwner = new char[320];
szOwner.Initialize();
Array.Copy(name.ToCharArray(), 0, szOwner, 0, name.Length);
Array.Copy(company.ToCharArray(), 0, szOwner, 36, company.Length);
Array.Copy(address.ToCharArray(), 0, szOwner, 72, address.Length);
Array.Copy(phone.ToCharArray(), 0, szOwner, 258, phone.Length);
Array.Copy(email.ToCharArray(), 0, szOwner, 283, email.Length);
byte[] byteOwner = UnicodeEncoding.Unicode.GetBytes(szOwner);
try
{
key.SetValue("Owner", byteOwner);
}
catch (System.Exception e)
{
key.Close();
throw e;
}
// 设置 "Owner Notes" 值
szOwner = new char[194];
szOwner.Initialize();
Array.Copy(notes.ToCharArray(), 0, szOwner, 0, notes.Length);
byteOwner = UnicodeEncoding.Unicode.GetBytes(szOwner);
try
{
key.SetValue("Owner Notes", byteOwner);
}
catch (System.Exception e)
{
key.Close();
throw e;
}
二 SP
注意:
1.
同PPC注意1
2. SP上各个项的字符限制为不大于2048个字符(< 2048),即不大于4Kbytes(4096bytes)。
代码如下:
1. 读取数据
SP上的读数据就简单多了
2. 写数据
和PPC写操作一样,也要注意那两点
{
key = Registry.CurrentUser.CreateSubKey("ControlPanel\\Owner");
if (key == null)
{
throw new InvalidOperationException("Write owner information failed
}
}
try
{
key.SetValue("Name", name);
key.SetValue("E-mail", email);
key.SetValue("Notes", notes);
key.SetValue("Telephone", phone);
}
catch (System.Exception e)
{
key.Close();
throw e;
}
__________
参考:
1."How
To" Series: Reading Device Owner Information on Windows Mobile
(注意我上面的“Phone: 50 bytes”,与原文“Phone: 48 bytes”的不同。经调试和跟踪证明是50字节,读者可以自己调试验证一下!)
2.Retrieving Owner Information on Pocket PC
__________
代码下载:
在WM 6 Classic, Professional, Standard上验证通过
OwnerInformation.rar
--------------------------------------------------
|
李森 – listen |
|
声明: Announce: |