本文由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盤,依此類推。
陸續增加中......