作者: 小林
问题 有的
程序员希望能够显示当前安装的 Windows 版本的
注册用户的信息,此信息包括用户名和单位。但 似乎找不到一个 Windwos API 函数来完成此功能。
方法
由于没有直接的方法来实现此功能,因此也就找不到单个的 Windows API 函数来显示注册信息,只能 由
程序员以高超的编程技巧联合好几个 Windows API 函数来完成此功能。
有关 Windows 系统注册用户的姓名和单位的信息实际上是保存在 Windows 的系统注册表中。要获取这 些信息,则需要打开注册表,找到正确的条目,然后取回所查找的关键字的值。
在本节中,将介绍如何在新的 Windows 9x 注册表数据库中查找适当的关键字及其值,从而完成检索用 户信息的任务。
步骤
按照下列步骤实现一个例子程序。运行此例子
程序,选择菜单 SysInfo 中选择菜单项 registration, 则弹出一个对话框,显示 Windows 系统注册用户的姓名和单位。
实现例子
程序的具体步骤如下:
1.在 Visual C++ 中,利用 AppWizard 创建新的项目文件,并命名此项目文件为 LD15.MAK.
2.进入 AppStudio 并创建新的对话框,添加两个静态文本域,标题分别为 User name 和 Organization。
3.与前两个静态文本域对齐,创建另外两个静态文本域,标题为空,ID 分别为 ID_USER_NAME 和 ID_ORGANIZATION。
4.改变对话框 ID 为 ID_USER_INFO,改变对话框标题为 User Registration Information。
5.进入 ClassWizard,选择按钮 Add Class。命名新类为 CUserRegDlg,选择基类为 CDIALOG, 并接受源代码和文件名和头文件名的缺省值。
6.在 ClassWizard,从对象 ID 中选择对象 CUserRegDlg ,选择消息 WM_INITDIALOG,点击按钮 Add Function,在函数 OnInitDialog 中输入下列代码:
BOOL CUserRegDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HKEY hkRoot,hkSubKey;
if(RegOpenKey(HKEY_LOCAL_MACHINE,NULL,&hkRoot)==ERROR_SUCCESS)
{
if(RegOpenKeyEx(hkRoot,
"SOFTWARE\\MICROSOFT\\Windows\\CurrentVersion\\",
0,KEY_ENUMERATE_SUB_KEYS|KEY_EXECUTE|KEY_QUERY_VALUE,
&hkSubKey)==ERROR_SUCCESS)
{
char ValueName[256];
unsigned char DataValue[256];
unsigned long cbValueName=256;
unsigned long cbDataValue=256;
DWORD dwType;
if(RegEnumValue(hkSubKey,4,ValueName,&cbValueName,NULL,
&dwType,DataValue,&cbDataValue)==ERROR_SUCCESS)
{
GetDlgItem(ID_USER_NAME)->
SetWindowText((char *)DataValue);
}
cbValueName=256;
cbDataValue=256;
if(RegEnumValue(hkSubKey,5,ValueName,&cbValueName,NULL,
&dwType,DataValue,&cbDataValue)==ERROR_SUCCESS)
{
GetDlgItem(ID_ORGANIZATION)->
SetWindowText((char *)DataValue);
}
RegCloseKey(hkSubKey);
}
RegCloseKey(hkRoot);
}
return TRUE; // return TRUE unless you set the focus to a control
}
7.返回 AppStudio,选择菜单 IDR_MAUNFRAME。在主菜单 SysINfo 中添加新的菜单项 User Registration,ID 为 ID_USER_REGISTRATION。
8.进入 ClassWizard,从下拉列表中选择类 CMainFrame,从对象 ID 列表中选择对象 ID_USER_REGISTRATION,从消息列表中选择消息 COMMAND。点击按钮 Add Function,函数命名为 OnUserRegistration。
9.选择按钮 Edit Code,在方法 OnUserRegistration 中输入下列代码:
void CMainFrame::OnUserRegistration()
{
CUserRegDlg dlg;
dlg.DoModal();
}
10.在文件 MAINFRM.CPP 的顶部添加下列行:
#include "UserRegDlg.h"
11.编译并运行此例子
程序。
用法
要检索用户信息,首先要打开并浏览 Windows 9x 的注册数据库。在此数据库中是一个包含 Windows 9x 系统各方面信息的关键字的层次集合。其中一个关键字可以按路径 SOFTWARE\\MICROSOFT\\Windows\\ CurrentVersion\来查找,此关键字包含检索用户名和单位的有用信息。
首先,必须打开注册数据库。要做到这一点,需要选择数据库中的一个根层次关键字并打开它。在本节 的例子程序中,此根层次关键字为 HKEY_LOCAL_MACHINE,调用 API 函数 RegOpenKey(或 RegOpenKeyEx) 打开此根层次关键字,然后调用函数 RegOpenKeyEx(在例子
程序中示范了这两个函数的使用,其实任一函数 都可用于这两种情况)打开子关键字,并且获得关键字 CurrentVersion 的句柄。
一旦从注册数据库中检测到句柄,就可以调用函数 RegEnumValue 来检索此关键字的某个值。在本节的 例子
程序中,我们感兴趣的两个值序号分别为4和5。一旦检索这两个值,就将其放置在对话框的静态文本 域中,并通过关闭所有打开的关键字来关闭数据库。关闭注册关键字句柄是通过调用 API 函数 RegCloseKey 来完成的。