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