程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi控制Windows的底層任務實例教程

Delphi控制Windows的底層任務實例教程

編輯:Delphi

Delphi控制Windows的底層任務代碼+思路和具體實現,運行該程序後,點擊窗體的最大化圖標時,窗體不會放大到屏幕大小,而是固定大小;當點擊“隱藏任務欄”和“顯示任務欄”時可以實現對Windows 底部的任務欄的隱藏和顯示;當點擊“隱藏鼠標”和“顯示鼠標”時,可以實現對Windows 鼠標的顯示狀態的控制;當點擊“透明背景色”按鈕時,桌面上所有圖標的文字的背景色都成為透明色;當點擊“最小化窗體”按鈕時,Windows 當前運行的所有窗體都自動最小化;當點擊“隱藏小圖標”按鈕時,Windows 桌面上所有圖標都自動隱藏;點擊“退出”按鈕,退出該程序的運行。同時,把鼠標放到各個按鈕上時,系統會自動彈出信息,提示該按鈕的作用。運行效果如下圖所示。

Delphi控制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 print? 001 unit Unit1; 002 interface 003 uses 004 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 005 StdCtrls; 006 type 007 TForm1 = class(TForm) 008 Button1: TButton; 009 Button2: TButton; 010 Button3: TButton; 011 Button4: TButton; 012 Button5: TButton; 013 Button6: TButton; 014 Button7: TButton; 015 Button8: TButton; 016 procedure Button1Click(Sender: TObject); 017 procedure Button2Click(Sender: TObject); 018 procedure Button3Click(Sender: TObject); 019 procedure Button4Click(Sender: TObject); 020 procedure Button5Click(Sender: TObject); 021 procedure Button8Click(Sender: TObject); 022 procedure Button6Click(Sender: TObject); 023 procedure Button7Click(Sender: TObject); 024 private 025 procedure WMGetMinMaxInfo( var Message:TWMGetMinMaxInfo ); 026 message WM_GETMINMAXINFO; 027 { Private declarations } 028 public 029 { Public declarations } 030 end; 031 var 032 Form1: TForm1; 033 implementation 034 {$R *.DFM} 035 procedure TForm1.WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo ); 036 begin 037 with Message.MinMaxInfo do 038 begin 039 ptMaxSize.X := 400{最大化時寬度} 040 ptMaxSize.Y := 400{最大化時高度} 041 ptMaxPosition.X := 199{最大化時左上角橫坐標} 042 ptMaxPosition.Y := 199{最大化時左上角縱坐標} 043 end; 044 Message.Result := 0{告訴Windows 你改變了 minmaxinfo} 045 inherited; 046 end; 047 procedure TForm1.Button1Click(Sender: TObject); //隱藏Windows 任務欄 048 var 049 wndHandle : THandle; 050 wndClass : array[0..50of Char; 051 begin 052 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); 053 wndHandle := FindWindow(@wndClass[0], nil); 054 ShowWindow(wndHandle, SW_HIDE); 055 End; 056 procedure TForm1.Button2Click(Sender: TObject); //顯示Windows 任務欄 057 var 058 wndHandle : THandle; 059 wndClass : array[0..50of Char; 060 begin 061 StrPCopy(@wndClass[0], ’Shell_TrayWnd’); 062 wndHandle := FindWindow(@wndClass[0], nil); 063 ShowWindow(wndHandle, SW_RESTORE); 064 end; 065 procedure TForm1.Button3Click(Sender: TObject); //退出程序 066 begin 067 close; 068 end; 069 procedure TForm1.Button4Click(Sender: TObject); //隱藏鼠標 070 var 071 temp:boolean; 072 begin 073 temp:=False; 074 ShowCursor(temp); 075 end; 076 procedure TForm1.Button5Click(Sender: TObject); //顯示鼠標 077 var 078 temp:boolean; 079 begin 080 temp:=true; 081 ShowCursor(temp); 082 end; 083 procedure TForm1.Button8Click(Sender: TObject); //顯示桌面,隱藏桌面圖標 084 var 085 hDesktop : THandle; 086 begin 087 hDesktop := FindWindow(’Progman’, nil); 088 ShowWindow(hDesktop, SW_HIDE); 089 end; 090 procedure TForm1.Button6Click(Sender: TObject); //使桌面圖標的背景色透明 091 var 092 wnd:HWND; 093 begin 094 Wnd := GetDesktopWindow; 095 Wnd := FindWindowEx(Wnd, 0, ’Progman’, nil); 096 Wnd := FindWindowEx(Wnd, 0, ’SHELLDLL_DefVIEw’, nil); 097 Wnd := FindWindowEx(Wnd, 0, ’SysListVIEw32’, nil); 098 SendMessage(Wnd, $10260$ffffffff); //this 099 SendMessage(Wnd, $10240$00ffffff); 100 InvalidateRect(Wnd, nilTRUE); 101 end; 102 procedure TForm1.Button7Click(Sender: TObject); //最小化全部窗體 103 var 104 h:HWnd; 105 begin 106 h:=handle; 107 while h > 0 do //當程序在運行 108 begin 109 if isWindowVisible(h) then //如果窗體可見(即沒有最小化) 110 postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0); 111 h:=getnextwindow(h,GW_HWNDNEXT); 112 end; 113 end; 114 end.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved