本文由lanyus從《奇思異想編程之DELPHI篇》收集整理,轉(zhuǎn)載請注明此處。
一、隱藏任務(wù)欄
在WINDOWS中,系統(tǒng)的任務(wù)欄本質(zhì)上也是一個窗口,其窗口類名為“Shell_TrayWnd"。要實現(xiàn)對它的操作,可通過API函
數(shù)FindWindow和
ShowWindow來達(dá)到目的。
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;
二、隱藏桌面上的快捷方式
跟任務(wù)欄一樣,桌面其實也是一個窗口,它的類名為“PRogMan”,同樣用FindWindow找到窗口句柄,再郵ShowWindow
來決定是否顯示。
三、獲取任務(wù)欄尺寸及位置
用FindWindow找到句柄,再用GetWindowRect獲取當(dāng)前任務(wù)欄尺寸大小。
GetWindowRect(HWND hWnd, //所求窗口的句柄
LPRECT lpRect //存儲窗口坐標(biāo)的結(jié)構(gòu)體的地址
):Boolean;
四、獲取CPU信息
CPU的相關(guān)信息是存儲在一個結(jié)構(gòu)體中的,這個結(jié)構(gòu)體由DELPHI用TSYSTEMINFO進行了封裝,定義如下:
typedef struct_SYSTEM_INFO{
union{
DWord dwOemId; //已改用如下結(jié)構(gòu)體分支來代替這個變量的使用了
struct{
WORD wProcessorArchitecture; //表示處理器的架構(gòu)
word wReserved; //保留字
};
};
DWORD swPageSiae; //分頁大小
LPVOID lpMinimumapplicationAddress; //應(yīng)用程序和動態(tài)鏈接庫可以訪問的最小地址
LPVOID lpMaximumApplicationAddress; //應(yīng)用程序和動態(tài)鏈接庫可以訪問的最大地址
DWORD swActiveProcessorMask; //活動處理器的掩碼
DWORD dwNumberOfProcessors; //處理器的數(shù)目
DWORD dwProcessorType; //處理器的類別
DWORD dwAllocationGranularity; //虛擬內(nèi)存地址分配的間隔
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信息調(diào)用API函數(shù)GetSystemInfo即可。
五、獲取內(nèi)存信息。
與獲取CPU一樣,系統(tǒng)依然采用了一個結(jié)構(gòu)體來存儲內(nèi)存信息。這個存儲內(nèi)在狀態(tài)信息的體定義下如:
typedef struct_MEMORYSTATUS{
DWORD dwLength; //SIZEOF(MEMORYSTATUS)即本結(jié)構(gòu)體的大小
DWORD dwMemoryLoad; //當(dāng)前使用內(nèi)存與總內(nèi)在的百分比
DWORD dwTotalPhys; //總物理內(nèi)存大小
DWORD dwAvailPhys; //可用物理內(nèi)存大小
DWORD dwTotalPageFile; //總頁面文件的大小
DWORD dwAvailPageFile; //可用頁面文件的大小
DWORD dwTotalVirtual; //總虛擬內(nèi)存的大小
DWORD dwAvailVirtual; //可用虛擬內(nèi)存的大小
}MEMORYSTATUS,*LPMEMORYSTATUS;
最后調(diào)用API函數(shù)GlobalMemoryStatus來獲取內(nèi)存信息。
六、獲取磁盤空間大小。 (測試發(fā)現(xiàn)不準(zhǔn))
使用API函數(shù)GetDiskFreeSpace。
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, //根目錄
LPDWORD lpSectorsPerCluster, //每簇的扇區(qū)數(shù)
LPDWORD lpBytesPerSector, //每個扇區(qū)的字節(jié)數(shù)
LPDWORD lpNumberOfFreeClusters, //可用的簇數(shù)
LPDWORD lpTotalNumberOfClusters //總簇數(shù)
);
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;
七、限制鼠標(biāo)移動范圍。
WINDOWS里有一個現(xiàn)成的API函數(shù)ClipCursor可以限制光標(biāo)移動區(qū)域。
BOOL ClipCursor(
CONST RECT *lpRect //指向一個存儲矩形范圍數(shù)據(jù)的結(jié)構(gòu)體
);
有了這個函數(shù)就可以限制光標(biāo)在屏幕的移動范圍了。但是,如果想控制鼠標(biāo)在某窗口的固定范圍內(nèi)移動,則需要調(diào)用咖
一個函數(shù)
MapWindowPoints,它可以將一個窗體的坐標(biāo)轉(zhuǎn)化為另一個相關(guān)的窗體坐標(biāo)。
int MapWindowPoints(
HWND hWndFrom, //源窗口句柄
HWND hWndTo, //目標(biāo)窗體句柄
LPPOINT lpPoints, //指向結(jié)構(gòu)體數(shù)組,包含需要轉(zhuǎn)化的坐標(biāo)
UINT cPoints //數(shù)組中結(jié)構(gòu)體的數(shù)量
);
參數(shù)hWndForm或hWndTo為NULL或HWND_DESKTOP時,表明所源窗體或目標(biāo)窗體為屏幕窗體。參數(shù)lpPoints可以指向一個
Rect結(jié)構(gòu)體,此時cPoints
的值將設(shè)為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函數(shù)。
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
sendmessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0);
end;
啟動屏幕保護程序還有一個方法,調(diào)用函數(shù)SystemParametersInfo,能過其參數(shù)設(shè)置可以啟動或關(guān)閉屏幕保護程序。
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0); //啟動屏保
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0); //關(guān)閉屏保
九、檢測驅(qū)動器是否準(zhǔn)備就緒。
在DELPHI中沒有提供專門的函數(shù)檢測驅(qū)動器是否準(zhǔn)備就緒,也不能直接調(diào)用一人API函數(shù)來實現(xiàn)這一操作。但是,我們
可以利用DiskSize來檢測磁盤容量,如果驅(qū)動器不存在或沒有準(zhǔn)備好,它會返回-1,其它情況下則返回該磁盤或光盤的
容量。
Function DiskSize(Drive:Byte):Int64;
參數(shù)為0時,表示指定當(dāng)前驅(qū)動器;為1時表示A盤,2表示B盤,依此類推。
陸續(xù)增加中......
新聞熱點
疑難解答
圖片精選