- ·上一篇文章:ASP教程之Request对象的使用
- ·下一篇文章:ASP教程19:最新的ASP、IIS安全漏洞
用API函数和注册表获取系统信息
通过调用Windows的API函数和访问Windows注册表,可以获取大量的系统信息。Delphi为绝大多数WindowsAPI函数提供了调用接口(可参见DELPHI3\SOURCE\RTL\WIN\windows.pas文件),并提供了一个功能全面的TRegistry类,使我们可以方便的调用WindowsAPI函数和访问注册表,例如:
1、function GetDriveType(lpRootPathName: PChar): UINT; 返回指定驱动器的类型。
2、function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; 返回指定 驱动器的总簇数、剩余簇数及每簇扇区数、每扇区字节数,从而可以计算出总容量和剩余空间。
3、function GetSystemMetrics(SM_CXSCREEN或 SM_CYSCREEN): Integer; 返回显示器分辨率。
4、function GetSystemMetrics(SM_CMOUSEBUTTONS): Integer; 返回鼠标的按键数目。
5、 在windows 注 册 表 的HKEY_LOCAL_MACHINE\ software\microsoft\windows\currentversion \RegisteredOwner主键下存放着Windows安装时输入的 用户名,可用以下语句读取。
myreg:=Tregistry.Create;
file://必须在程序单元的uses部分加入Registry
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.openkey(注释:software\microsoft \windows\currentversion注释:,false) then
memo1.lines.add(注释: 注册用户名: 注释:+myreg.readstring(注释:RegisteredOwner注释:));
myreg.closekey;
以上仅举几例,获取其他一些信息的方法与此类似详见源程序。
本程序在win95、Delphi3 下调试通过。
附: 源 程 序 清 单。
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Registry;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,x,y:integer;
ch:char; file://驱动器字符注释:A注释:~注释:Z注释:
buffer:string;
cpuinfo:TSYSTEMINFO; file://存放系统信息的记录类型,在Windows.pas中查到详细内容。
meminfo:TMemoryStatus; file://存放系统内存信息的记录类型。
computername,username:pchar; file://计算机名称、用户名
spc,bps,nofc,tnoc:longint; file://用于存放磁盘容量的变量
myreg:Tregistry; file://用于访问注册表的TRegistry变量
begin
memo1.Lines.Clear;
for ch:=注释:A注释: to 注释:Z注释: do begin
i:=getdrivetype(pchar(ch+注释::\注释:));
buffer:=注释: 注释:+ch+注释:: 注释:;
case i of
DRIVE_UNKNOWN : buffer:=buffer+注释:未知类型注释:;
DRIVE_REMOVABLE: buffer:=buffer+注释:软盘注释:;
DRIVE_FIXED : begin
buffer:=buffer+注释:硬盘注释:;
if getdiskfreespace(pchar(ch+注释::\注释:),spc,bps,nofc,tnoc) then
begin
buffer:=buffer+注释:总容量: 注释:+inttostr((spc*bps*tnoc) div (1024*1024))+注释:MB注释:;
buffer:=buffer+注释:剩余: 注释:+inttostr((spc*bps*nofc) div (1024*1024))+注释:MB注释:;
end;
end;
DRIVE_REMOTE : buffer:=buffer+注释:网络驱动器注释:;
DRIVE_CDROM :buffer:=buffer+注释:CD-ROM驱动器注释:;
DRIVE_RAMDISK:buffer:=buffer+注释:RAM虚拟驱动器注释:;
end;
if (ch >注释:D注释:) and (i=1) then break;
if i< >1 then memo1.Lines.Add(buffer);
end;
case getkeyboardtype(0) of file://获取键盘类型
1: buffer:=注释: 键盘: IBM PC/XT或兼容类型(83键)注释:;
2: buffer:=注释: 键盘: Olivetti "ICO"(102键)注释:;
3: buffer:=注释: 键盘: IBM PC/AT(84键)注释:;
4: buffer:=注释: 键盘: IBM增强型(101或102键)注释:;
5: buffer:=注释: 键盘: Nokia 1050注释:;
6: buffer:=注释: 键盘: Nokia 9140注释:;
7: buffer:=注释: 键盘: Japanese注释:;
end;
memo1.lines.add(buffer);
file://获取键盘功能键数目
memo1.lines.add(注释: 功能键数目: 注释:+inttostr(getkeyboardtype(2)));
memo1.Lines.add(注释:显示器分辨率: 注释:+inttostr(getsystemmetrics(SM_CXSCREEN)) +注释: x注释:+
inttostr(getsystemmetrics(SM_CYSCREEN)));
file://获取鼠标按键数目
memo1.Lines.add(注释: 鼠标: 注释:+inttostr(getsystemmetrics(SM_CMOUSEBUTTONS))+注释:键注释:);
globalmemorystatus(meminfo); file://获取系统内存数量
memo1.lines.add(注释: 物理内存: 注释:+inttostr(meminfo.dwTotalPhys div 1024)+注释: KB注释:);
i:=getsystemmetrics(SM_CLEANBOOT);
case i of
0:buffer:=注释:系统启动模式:正常模式注释:;
1:buffer:=注释:系统启动模式:保护模式注释:;
2:buffer:=注释:系统启动模式:网络保护模式注释:;
end;
memo1.lines.add(buffer);
x:=getsystemmetrics(SM_ARRANGE);
file://获取系统最小化窗口的起始位置和排列方式
y:=x;
x:=x and 3;
y:=y and 12;
case x of
ARW_BOTTOMLEFT : buffer:=注释: 最小化窗口:自左下角注释:;
ARW_BOTTOMRIGHT : buffer:=注释: 最小化窗口:自右下角注释:;
ARW_TOPLEFT : buffer:=注释: 最小化窗口:自左上角注释:;
ARW_TOPRIGHT : buffer:=注释: 最小化窗口:自右上角注释:;
end;
case y of
ARW_LEFT : buffer:=buffer+注释:横向排列注释:;
ARW_UP : buffer:=buffer+注释:纵向排列注释:;
ARW_HIDE : buffer:=buffer+注释:隐藏注释:;
end;
memo1.lines.add(buffer);
getmem(computername,255); file://获取计算机名称和用户名
getmem(username,255);
i:=255;
getcomputername(computername,i);
memo1.lines.add(注释: 计算机名称: 注释:+computername);
getusername(username,i);
memo1.lines.add(注释: 用户名: 注释:+username);
freemem(computername);
freemem(username);
getsysteminfo(cpuinfo); file://获取CPU类型
case cpuinfo.dwProcessorType of
386 : buffer:=注释: CPU类型: 386注释:;
486 : buffer:=注释: CPU类型: 486注释:;
586 : buffer:=注释: CPU类型: Pentium注释:;
end;
memo1.Lines.add(buffer);
file://从注册表中获取CPU标识,Windows版本,
产品标识,注册单位名称及用户名
myreg:=Tregistry.Create;
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.OpenKey(注释:hardware\description\
system\centralprocessor\0注释:,false) then
memo1.lines.add(注释: CPU标识:
注释:+myreg.ReadString(注释:VendorIdentifier注释:));
myreg.closekey;
if myreg.openkey(注释:software\microsoft\ windows\currentversion注释:,false) then
begin
memo1.lines.add(注释: windows版本: 注释:+myreg.ReadString(注释:Version注释:));
memo1.lines.add(注释: 版本号: 注释:+myreg.ReadString(注释:VersionNumber注释:)+注释: 注释:+myreg.ReadString(注释:Subversionnumber注释:));
memo1.lines.add(注释: 产品标识: 注释:+myreg.Readstring(注释:ProductID注释:));
memo1.lines.add(注释:注册单位名称: 注释:+myreg.readstring(注释:RegisteredOrganization注释:));
memo1.lines.add(注释: 注册用户名: 注释:+myreg.readstring(注释:RegisteredOwner注释:));
end;
myreg.CloseKey;
myreg.Free;
end;
end
1、function GetDriveType(lpRootPathName: PChar): UINT; 返回指定驱动器的类型。
2、function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; 返回指定 驱动器的总簇数、剩余簇数及每簇扇区数、每扇区字节数,从而可以计算出总容量和剩余空间。
3、function GetSystemMetrics(SM_CXSCREEN或 SM_CYSCREEN): Integer; 返回显示器分辨率。
4、function GetSystemMetrics(SM_CMOUSEBUTTONS): Integer; 返回鼠标的按键数目。
5、 在windows 注 册 表 的HKEY_LOCAL_MACHINE\ software\microsoft\windows\currentversion \RegisteredOwner主键下存放着Windows安装时输入的 用户名,可用以下语句读取。
myreg:=Tregistry.Create;
file://必须在程序单元的uses部分加入Registry
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.openkey(注释:software\microsoft \windows\currentversion注释:,false) then
memo1.lines.add(注释: 注册用户名: 注释:+myreg.readstring(注释:RegisteredOwner注释:));
myreg.closekey;
以上仅举几例,获取其他一些信息的方法与此类似详见源程序。
本程序在win95、Delphi3 下调试通过。
附: 源 程 序 清 单。
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Registry;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,x,y:integer;
ch:char; file://驱动器字符注释:A注释:~注释:Z注释:
buffer:string;
cpuinfo:TSYSTEMINFO; file://存放系统信息的记录类型,在Windows.pas中查到详细内容。
meminfo:TMemoryStatus; file://存放系统内存信息的记录类型。
computername,username:pchar; file://计算机名称、用户名
spc,bps,nofc,tnoc:longint; file://用于存放磁盘容量的变量
myreg:Tregistry; file://用于访问注册表的TRegistry变量
begin
memo1.Lines.Clear;
for ch:=注释:A注释: to 注释:Z注释: do begin
i:=getdrivetype(pchar(ch+注释::\注释:));
buffer:=注释: 注释:+ch+注释:: 注释:;
case i of
DRIVE_UNKNOWN : buffer:=buffer+注释:未知类型注释:;
DRIVE_REMOVABLE: buffer:=buffer+注释:软盘注释:;
DRIVE_FIXED : begin
buffer:=buffer+注释:硬盘注释:;
if getdiskfreespace(pchar(ch+注释::\注释:),spc,bps,nofc,tnoc) then
begin
buffer:=buffer+注释:总容量: 注释:+inttostr((spc*bps*tnoc) div (1024*1024))+注释:MB注释:;
buffer:=buffer+注释:剩余: 注释:+inttostr((spc*bps*nofc) div (1024*1024))+注释:MB注释:;
end;
end;
DRIVE_REMOTE : buffer:=buffer+注释:网络驱动器注释:;
DRIVE_CDROM :buffer:=buffer+注释:CD-ROM驱动器注释:;
DRIVE_RAMDISK:buffer:=buffer+注释:RAM虚拟驱动器注释:;
end;
if (ch >注释:D注释:) and (i=1) then break;
if i< >1 then memo1.Lines.Add(buffer);
end;
case getkeyboardtype(0) of file://获取键盘类型
1: buffer:=注释: 键盘: IBM PC/XT或兼容类型(83键)注释:;
2: buffer:=注释: 键盘: Olivetti "ICO"(102键)注释:;
3: buffer:=注释: 键盘: IBM PC/AT(84键)注释:;
4: buffer:=注释: 键盘: IBM增强型(101或102键)注释:;
5: buffer:=注释: 键盘: Nokia 1050注释:;
6: buffer:=注释: 键盘: Nokia 9140注释:;
7: buffer:=注释: 键盘: Japanese注释:;
end;
memo1.lines.add(buffer);
file://获取键盘功能键数目
memo1.lines.add(注释: 功能键数目: 注释:+inttostr(getkeyboardtype(2)));
memo1.Lines.add(注释:显示器分辨率: 注释:+inttostr(getsystemmetrics(SM_CXSCREEN)) +注释: x注释:+
inttostr(getsystemmetrics(SM_CYSCREEN)));
file://获取鼠标按键数目
memo1.Lines.add(注释: 鼠标: 注释:+inttostr(getsystemmetrics(SM_CMOUSEBUTTONS))+注释:键注释:);
globalmemorystatus(meminfo); file://获取系统内存数量
memo1.lines.add(注释: 物理内存: 注释:+inttostr(meminfo.dwTotalPhys div 1024)+注释: KB注释:);
i:=getsystemmetrics(SM_CLEANBOOT);
case i of
0:buffer:=注释:系统启动模式:正常模式注释:;
1:buffer:=注释:系统启动模式:保护模式注释:;
2:buffer:=注释:系统启动模式:网络保护模式注释:;
end;
memo1.lines.add(buffer);
x:=getsystemmetrics(SM_ARRANGE);
file://获取系统最小化窗口的起始位置和排列方式
y:=x;
x:=x and 3;
y:=y and 12;
case x of
ARW_BOTTOMLEFT : buffer:=注释: 最小化窗口:自左下角注释:;
ARW_BOTTOMRIGHT : buffer:=注释: 最小化窗口:自右下角注释:;
ARW_TOPLEFT : buffer:=注释: 最小化窗口:自左上角注释:;
ARW_TOPRIGHT : buffer:=注释: 最小化窗口:自右上角注释:;
end;
case y of
ARW_LEFT : buffer:=buffer+注释:横向排列注释:;
ARW_UP : buffer:=buffer+注释:纵向排列注释:;
ARW_HIDE : buffer:=buffer+注释:隐藏注释:;
end;
memo1.lines.add(buffer);
getmem(computername,255); file://获取计算机名称和用户名
getmem(username,255);
i:=255;
getcomputername(computername,i);
memo1.lines.add(注释: 计算机名称: 注释:+computername);
getusername(username,i);
memo1.lines.add(注释: 用户名: 注释:+username);
freemem(computername);
freemem(username);
getsysteminfo(cpuinfo); file://获取CPU类型
case cpuinfo.dwProcessorType of
386 : buffer:=注释: CPU类型: 386注释:;
486 : buffer:=注释: CPU类型: 486注释:;
586 : buffer:=注释: CPU类型: Pentium注释:;
end;
memo1.Lines.add(buffer);
file://从注册表中获取CPU标识,Windows版本,
产品标识,注册单位名称及用户名
myreg:=Tregistry.Create;
myreg.RootKey:=HKEY_LOCAL_MACHINE;
if myreg.OpenKey(注释:hardware\description\
system\centralprocessor\0注释:,false) then
memo1.lines.add(注释: CPU标识:
注释:+myreg.ReadString(注释:VendorIdentifier注释:));
myreg.closekey;
if myreg.openkey(注释:software\microsoft\ windows\currentversion注释:,false) then
begin
memo1.lines.add(注释: windows版本: 注释:+myreg.ReadString(注释:Version注释:));
memo1.lines.add(注释: 版本号: 注释:+myreg.ReadString(注释:VersionNumber注释:)+注释: 注释:+myreg.ReadString(注释:Subversionnumber注释:));
memo1.lines.add(注释: 产品标识: 注释:+myreg.Readstring(注释:ProductID注释:));
memo1.lines.add(注释:注册单位名称: 注释:+myreg.readstring(注释:RegisteredOrganization注释:));
memo1.lines.add(注释: 注册用户名: 注释:+myreg.readstring(注释:RegisteredOwner注释:));
end;
myreg.CloseKey;
myreg.Free;
end;
end


