通過調(diào)用Windows的API函數(shù)和訪問Windows注冊表,可以獲取大量的系統(tǒng)信息。Delphi為絕大多數(shù)WindowsAPI函數(shù)提供了調(diào)用接口(可參見DELPHI3\SOURCE\RTL\WIN\windows.pas文件),并提供了一個功能全面的TRegistry類,使我們可以方便的調(diào)用WindowsAPI函數(shù)和訪問注冊表,例如:
1、function GetDriveType(lpRootPathName: PChar): UINT; 返回指定驅(qū)動器的類型。
2、function GetDiskFreeSpace(lpRootPathName: PChar; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; 返回指定 驅(qū)動器的總簇數(shù)、剩余簇數(shù)及每簇扇區(qū)數(shù)、每扇區(qū)字節(jié)數(shù),從而可以計算出總?cè)萘亢褪S嗫臻g。
3、function GetSystemMetrics(SM_CXSCREEN或 SM_CYSCREEN): Integer; 返回顯示器分辨率。
4、function GetSystemMetrics(SM_CMOUSEBUTTONS): Integer; 返回鼠標的按鍵數(shù)目。
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 下調(diào)試通過。
附: 源 程 序 清 單。
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://驅(qū)動器字符注釋:A注釋:~注釋:Z注釋:
buffer:string;
cpuinfo:TSYSTEMINFO; file://存放系統(tǒng)信息的記錄類型,在Windows.pas中查到詳細內(nèi)容。
meminfo:TMemoryStatus; file://存放系統(tǒng)內(nèi)存信息的記錄類型。
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+注釋:總?cè)萘? 注釋:+inttostr((spc*bps*tnoc) div (1024*1024))+注釋:MB注釋:;
buffer:=buffer+注釋:剩余: 注釋:+inttostr((spc*bps*nofc) div (1024*1024))+注釋:MB注釋:;
end;
end;
DRIVE_REMOTE : buffer:=buffer+注釋:網(wǎng)絡(luò)驅(qū)動器注釋:;
DRIVE_CDROM :buffer:=buffer+注釋:CD-ROM驅(qū)動器注釋:;
DRIVE_RAMDISK:buffer:=buffer+注釋:RAM虛擬驅(qū)動器注釋:;
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://獲取鍵盤功能鍵數(shù)目
memo1.lines.add(注釋: 功能鍵數(shù)目: 注釋:+inttostr(getkeyboardtype(2)));
memo1.Lines.add(注釋:顯示器分辨率: 注釋:+inttostr(getsystemmetrics(SM_CXSCREEN)) +注釋: x注釋:+
inttostr(getsystemmetrics(SM_CYSCREEN)));
file://獲取鼠標按鍵數(shù)目
memo1.Lines.add(注釋: 鼠標: 注釋:+inttostr(getsystemmetrics(SM_CMOUSEBUTTONS))+注釋:鍵注釋:);
globalmemorystatus(meminfo); file://獲取系統(tǒng)內(nèi)存數(shù)量
memo1.lines.add(注釋: 物理內(nèi)存: 注釋:+inttostr(meminfo.dwTotalPhys div 1024)+注釋: KB注釋:);
i:=getsystemmetrics(SM_CLEANBOOT);
case i of
0:buffer:=注釋:系統(tǒng)啟動模式:正常模式注釋:;
1:buffer:=注釋:系統(tǒng)啟動模式:保護模式注釋:;
2:buffer:=注釋:系統(tǒng)啟動模式:網(wǎng)絡(luò)保護模式注釋:;
end;
memo1.lines.add(buffer);
x:=getsystemmetrics(SM_ARRANGE);
file://獲取系統(tǒng)最小化窗口的起始位置和排列方式
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版本,
產(chǎn)品標識,注冊單位名稱及用戶名
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(注釋: 產(chǎn)品標識: 注釋:+myreg.Readstring(注釋:ProductID注釋:));
memo1.lines.add(注釋:注冊單位名稱: 注釋:+myreg.readstring(注釋:RegisteredOrganization注釋:));
memo1.lines.add(注釋: 注冊用戶名: 注釋:+myreg.readstring(注釋:RegisteredOwner注釋:));
end;
myreg.CloseKey;
myreg.Free;
end;
end