问题
有的程序员希望能够显示当前安装的 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 来完成的。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/