本文由lanyus从《奇思异想编程之DELPHI篇》收集整理,转载请注明此处。 一、隐藏任务栏 在WINDOWS中,系统的任务栏本质上也是一个窗口,其窗口类名为“Shell_TrayWnd"。要实现对它的操作,可通过API函 数FindWindow和 ShowWindow来达到目的。 var wndHandle:THandle; wndClass:Array[0..50] of char; begin StrPCopy(@wndClass[0],''''Shell_TrayWnd''''); wndHandle:=FindWindow(@wndClass[0],nil); ShowWindow(wndHandle,SW_HIDE); //sw_restore end; 二、隐藏桌面上的快捷方式 跟任务栏一样,桌面其实也是一个窗口,它的类名为“ProgMan”,同样用FindWindow找到窗口句柄,再邮ShowWindow
来决定是否显示。 三、获取任务栏尺寸及位置 用FindWindow找到句柄,再用GetWindowRect获取当前任务栏尺寸大小。 GetWindowRect(HWND hWnd, //所求窗口的句柄 LPRECT lpRect //存储窗口坐标的结构体的地址 ):Boolean; 四、获取CPU信息 CPU的相关信息是存储在一个结构体中的,这个结构体由DELPHI用TSYSTEMINFO进行了封装,定义如下: typedef struct_SYSTEM_INFO{ union{ DWORD dwOemId; //已改用如下结构体分支来代替这个变量的使用了 struct{ WORD wProcessorArchitecture; //表示处理器的架构 word wReserved; //保留字 }; }; DWORD swPageSiae; //分页大小 LPVOID lpMinimumApplicationAddress; //应用程序和动态链接库可以访问的最小地址 LPVOID lpMaximumApplicationAddress; //应用程序和动态链接库可以访问的最大地址 DWORD swActiveProcessorMask; //活动处理器的掩码 DWORD dwNumberOfProcessors; //处理器的数目 DWORD dwProcessorType; //处理器的类别 DWORD dwAllocationGranularity; //虚拟内存地址分配的间隔 WORD wProcessorLevel; //处理器的级别 WORD wProcessorRevision; //处理器修改信息 }SYSTEM_INFO; 其中dwProcessorType由wProcessorArchitecture、wProcessorLevel和wProcessorRevision三个成员来确定,其值为: PROCESSOR_INTEL_386:INTEL80386系列; PROCESSOR_ITNEL_486:INTEL80486系列; PROCESSOR_INTEL_PENTIUM:INTEL PENTIUM系列; PROCESSOR_MIPS_R4000:MIPS的4000系列(仅适用于WINDOWS NT); PROCESSOR_ALPHA_21064:ALPHA的21064系列(仅适用于WINDOWS NT); 另外,获得CPU信息调用API函数GetSystemInfo即可。 五、获取内存信息。 与获取CPU一样,系统依然采用了一个结构体来存储内存信息。这个存储内在状态信息的体定义下如: typedef struct_MEMORYSTATUS{ DWORD dwLength; //SIZEOF(MEMORYSTATUS)即本结构体的大小 DWORD dwMemoryLoad; //当前使用内存与总内在的百分比 DWORD dwTotalPhys; //总物理内存大小 DWORD dwAvailPhys; //可用物理内存大小 DWORD dwTotalPageFile; //总页面文件的大小 DWORD dwAvailPageFile; //可用页面文件的大小 DWORD dwTotalVirtual; //总虚拟内存的大小 DWORD dwAvailVirtual; //可用虚拟内存的大小 }MEMORYSTATUS,*LPMEMORYSTATUS; 最后调用API函数GlobalMemoryStatus来获取内存信息。 六、获取磁盘空间大小。 (测试发现不准) 使用API函数GetDiskFreeSpace。 BOOL GetDiskFreeSpace( LPCTSTR lpRootPathName, //根目录 LPDWORD lpSectorsPerCluster, //每簇的扇区数 LPDWORD lpBytesPerSector, //每个扇区的字节数 LPDWORD lpNumberOfFreeClusters, //可用的簇数 LPDWORD lpTotalNumberOfClusters //总簇数 ); procedure TForm1.BitBtn1Click(Sender: TObject); var Secspclu,Bytespsec,Freeclu,Totalclu,Ts,Fs:DWORD; begin GetDiskFreeSpace(''''c:\'''',Secspclu,Bytespsec,Freeclu,Totalclu); Fs:=Freeclu*Secspclu*Bytespsec; Ts:=Totalclu*Secspclu*Bytespsec; Edit1.text:=FormatFloat(''''###,###'''',Ts); //总空间 Edit2.text:=FormatFloat(''''###,###'''',Fs); //可用空间 end; 七、限制鼠标移动范围。 WINDOWS里有一个现成的API函数ClipCursor可以限制光标移动区域。 BOOL ClipCursor( CONST RECT *lpRect //指向一个存储矩形范围数据的结构体 ); 有了这个函数就可以限制光标在屏幕的移动范围了。但是,如果想控制鼠标在某窗口的固定范围内移动,则需要调用咖 一个函数 MapWindowPoints,它可以将一个窗体的坐标转化为另一个相关的窗体坐标。 int MapWindowPoints( HWND hWndFrom, //源窗口句柄 HWND hWndTo, //目标窗体句柄 LPPOINT lpPoints, //指向结构体数组,包含需要转化的坐标 UINT cPoints //数组中结构体的数量 ); 参数hWndForm或hWndTo为NULL或HWND_DESKTOP时,表明所源窗体或目标窗体为屏幕窗体。参数lpPoints可以指向一个 Rect结构体,此时cPoints 的值将设为2。 procedure TForm1.BitBtn1Click(Sender: TObject); var sc:TRect; begin sc:=BitBtn2.BoundsRect; MapWindowPoints(handle,0,sc,2); ClipCursor(@sc); end; procedure TForm1.BitBtn2Click(Sender: TObject); var sc:TRect; begin sc:=RECT(0,0,screen.Width,screen.Height); ClipCursor(@sc); end; 八、如何启动屏幕保护程序。 使用SendMessage或PostMessage函数。 procedure TForm1.BitBtn3Click(Sender: TObject); begin sendmessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0); end; 启动屏幕保护程序还有一个方法,调用函数SystemParametersInfo,能过其参数设置可以启动或关闭屏幕保护程序。 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0); //启动屏保 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0); //关闭屏保 九、检测驱动器是否准备就绪。 在DELPHI中没有提供专门的函数检测驱动器是否准备就绪,也不能直接调用一人API函数来实现这一操作。但是,我们
可以利用DiskSize来检测磁盘容量,如果驱动器不存在或没有准备好,它会返回-1,其它情况下则返回该磁盘或光盘的 容量。 Function DiskSize(Drive:Byte):Int64; 参数为0时,表示指定当前驱动器;为1时表示A盘,2表示B盘,依此类推。 陆续增加中......
[系统软件]InstallShield Express for delphi制作安装程序定… [常用软件]InstallShield Express制作Delphi数据库安装程序 [Delphi程序]为什么选择Delphi.Net ? [Delphi程序]《关于VisiBroker For Delphi的使用》(4) [Delphi程序]Delphi 程序员代码编写标准指南 [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro… [Delphi程序]Borland Delphi 9 的新特性 [Delphi程序]Delphi 键盘码表 [Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗? [Delphi程序]Delphi Access violations 问题的解决之道
|