Delphi控制Windows的底層任務代碼+思路和具體實現,運行該程序後,點擊窗體的最大化圖標時,窗體不會放大到屏幕大小,而是固定大小;當點擊“隱藏任務欄”和“顯示任務欄”時可以實現對Windows 底部的任務欄的隱藏和顯示;當點擊“隱藏鼠標”和“顯示鼠標”時,可以實現對Windows 鼠標的顯示狀態的控制;當點擊“透明背景色”按鈕時,桌面上所有圖標的文字的背景色都成為透明色;當點擊“最小化窗體”按鈕時,Windows 當前運行的所有窗體都自動最小化;當點擊“隱藏小圖標”按鈕時,Windows 桌面上所有圖標都自動隱藏;點擊“退出”按鈕,退出該程序的運行。同時,把鼠標放到各個按鈕上時,系統會自動彈出信息,提示該按鈕的作用。運行效果如下圖所示。
簡要說下設計思路:程序利用的控件主要是Button 控件,添加Button 控件的Hint 屬性可以實現自動消息提示。編程的關鍵是巧妙調用各種Windows API 函數來實現對窗體、桌面和鼠標的一些高級控制。另外通過定義窗體最大化後的位置和大小是實現對窗體最大化按鈕的控制。
具體設計步驟:本例中需要解決五個問題:對窗體最大化的操作、隱藏和顯示任務欄、隱藏和顯示鼠標、最小化所有運行窗體和控制Windows 的桌面及其圖標。通過對窗體Form 的ptMaxSize.X、ptMaxSize.Y、ptMaxPosition.X 和ptMaxPosition.Y賦值,可以實現對窗體最大化後的位置和大小位置的控制;利用ShowWindow(wndHandle,SW_HIDE)和ShowWindow(wndHandle, SW_RESTORE)兩個函數,可以實現隱藏和顯示Windows 的任務欄;利用函數ShowCursor(False)和ShowCursor(true)可以實現隱藏和顯示鼠標;利用ShowWindow(hDesktop, SW_HIDE)函數,可以實現隱藏桌面上的小圖標;巧妙調用各個Windows API 函數可以解決許多類型問題。
1.新建工程:
(1)啟動Delphi 6.0 程序。選擇“文件”菜單下的“新建”命令,從彈出的子菜單中選擇Application 選項,則出現新建工程的Form1 窗口。
(2)選擇“文件”菜單下的“工程另存為”命令,彈出Save Unit1 As 對話框。在“保存在”列表框中選擇需要存放該窗口文件所在的目錄名;在“文件名”編輯框中填寫文件名,這裡填寫“Unit1”,點擊“保存”按鈕,保存上面的選項。
(3)執行上一步後,將彈出“工程另存為”對話框。在“保存在”列表框中選擇需要存放該工程的目錄名,最好和第(2)步選取相同的目錄;在“文件名”編輯框中填寫保存處理該工程的源代碼的文件名,這裡填寫“Project1”,點擊“保存”按鈕,保存上面的選項。
2.修改窗口:
(1)激活Form1 窗口,在“屬性”面板中設置該窗體的Caption 屬性為“Windows底層任務控制”,Color 屬性設置為“clSkyBlue”。
(2)選擇“標准”頁上的Button 選項,在窗體中添加8 個Button 標簽,調整其合適的大小和位置。按下Shift 鍵,同時選中這8 個按鈕,選擇“編輯”菜單下的“對齊”命令,在彈出的對話框中為Button 按鈕選擇合適的對齊方式。然後在“屬性”面板中設置其Caption 屬性分別為“隱藏任務欄”、“顯示任務欄”、“隱藏鼠標”、“顯示鼠標”、“透明背景色”、“最小化窗體”、“隱藏小圖標”和“退出”。
(3)分別選中各個Button 控件,在“屬性”面板上設置其ShowHint 屬性均為True。然後設置其Hint 屬性分別為“隱藏Windows 底部的任務欄”、“顯示Windows 底部的任務欄”、“隱藏桌面的鼠標”、“顯示桌面的鼠標”、“將桌面上的圖標的背景色變為透明”、“最小化當前運行的全部窗體”、“隱藏桌面上的小圖標”和“退出該應用程序”。
相關代碼分析:
(1)通過對窗體Form 的ptMaxSize.X、ptMaxSize.Y、ptMaxPosition.X 和ptMax_Position.Y 的賦值可實現對窗體最大化後位置和大小的控制。
procedure TForm1.WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo ); begin with Message.MinMaxInfo do begin ptMaxSize.X := 400; {最大化時寬度} ptMaxSize.Y := 400; {最大化時高度} ptMaxPosition.X := 199; {最大化時左上角橫坐標} ptMaxPosition.Y := 199; {最大化時左上角縱坐標} end; Message.Result := 0; {告訴Windows 你改變了 minmaxinfo} inherited; end;
(2)利用ShowWindow()函數來實現隱藏和顯示Windows 的任務欄,ShowWindow(wndHandle, SW_HIDE)函數隱藏任務欄,而ShowWindow(wndHandle, SW_RESTORE)函數顯示任務欄。下面列出隱藏任務欄的代碼,要顯示任務欄時,只需修改程序最後的一句。
procedure TForm1.Button1Click(Sender: TObject); //隱藏Windows 任務欄 var wndHandle : THandle; wndClass : array[0..50] of Char; begin StrPCopy(@wndClass[0], ’Shell_TrayWnd’); wndHandle := FindWindow(@wndClass[0], nil); ShowWindow(wndHandle, SW_HIDE); End;
(3)利用函數ShowCursor(False)和ShowCursor(true)可以實現隱藏和顯示鼠標,不過先得定義一個Boolen 布爾形變量。
procedure TForm1.Button4Click(Sender: TObject); //隱藏鼠標 var temp:boolean; begin temp:=False; ShowCursor(temp); end;
顯示鼠標的代碼類似,只需將Temp 賦值為真True 即可。
(4)當點擊“隱藏小圖標”按鈕時,需要實現自動隱藏Windows 桌面上的各個小圖標,這可以用以下語句來實現。
procedure TForm1.Button8Click(Sender: TObject); //顯示桌面,隱藏桌面圖標 var hDesktop : THandle; begin hDesktop := FindWindow(’Progman’, nil); ShowWindow(hDesktop, SW_HIDE); end;
(5)當點擊“最小化窗體”按鈕時,需要實現自動最小化當前運行的各個程序的窗體。首先需要判斷是否有程序在運行,如果程序在運行,而窗口又可見(即沒有最小化時),需要對該窗口進行最小化操作,代碼如下:
procedure TForm1.Button7Click(Sender: TObject); //最小化全部窗體 var h:HWnd; begin h:=handle; while h > 0 do //當程序在運行 begin if isWindowVisible(h) then //如果窗體可見(即沒有最小化) postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0); h:=getnextwindow(h,GW_HWNDNEXT); end; end;
完整的程序代碼:
vIEw source