完全控制你的Windows案頭
對於Windows的案頭介面相信大家已經十分熟悉了,佔據螢幕大半部分的是案頭,在上面排列的是案頭表徵圖。
工作列一般位於案頭的下面,也可以在案頭其它邊緣。在最左邊是“開始按鈕”,接下來是“快速啟動按鈕”區、
程式按鈕區,再下來是工作列表徵圖區,在上面一般會有音量大小表徵圖和IME調節表徵圖和時鐘等。
本文首先介紹如何隱藏工作列中的上面介紹的部分。我們知道利用Windows的Api函數ShowWindow可以隱藏或
者顯示視窗,關鍵是如何得到視窗的控制代碼。在Windows下的每一個視窗不但有一個視窗控制代碼標示視窗,還有一個稱
為類名的字串標示視窗。如果知道視窗的類名,通過FindWindow函數就可以獲得視窗的控制代碼。而Windows案頭
本身就是一個視窗,案頭表徵圖區、工作列以及工作列下的開始按鈕等都是它的子視窗。我們可以通過FindWindowEx
函數來尋找這些視窗。再利用ShowWindow函數隱藏或顯示視窗。下面通過一個Delphi的範例來示範如何控制工作列。
首先建立一個新的Delphi工程,然後在Form1中加入7個CheckBox控制項,然後在Form1中添加下面的代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;
procedure FormCreate(Sender: TObject);
private
procedure CheckButtonClick(Sender:TObject);
{ Private declarations }
public
{ Public declarations }
end;
Const
file://定義不同視窗的類名
sTrayWindow = 'Shell_TrayWnd';
sTrayNotify = 'TrayNotifyWnd';
sStartButton = 'Button';
sAppSwitchBar = 'ReBarWindow32';
sAppSwitch = 'MSTaskSwWClass';
sAppIcon = 'ToolbarWindow32';
sTrayClock = 'TrayClockWClass';
sDesktopIcon = 'ShellDll_DefView';
sProgman = 'Progman';
var
Form1: TForm1;
wnd:Integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1.Caption := '隱藏工作列';
CheckBox1.OnClick := CheckButtonClick;
CheckBox2.Caption := '隱藏開始按鈕';
CheckBox2.OnClick := CheckButtonClick;
CheckBox3.Caption := '隱藏工作列表徵圖';
CheckBox3.OnClick := CheckButtonClick;
CheckBox4.Caption := '隱藏程式按鈕';
CheckBox4.OnClick := CheckButtonClick;
CheckBox5.Caption := '隱藏工作列時鐘';
CheckBox5.OnClick := CheckButtonClick;
CheckBox6.Caption := '隱藏案頭表徵圖';
CheckBox6.OnClick := CheckButtonClick;
CheckBox7.Caption := '隱藏快速運行表徵圖';
CheckBox7.OnClick := CheckButtonClick;
end;
file://7個CheckBox控制項的Click處理函數
procedure TForm1.CheckButtonClick(Sender:TObject);
var
i:Integer;
begin
file://找到工作列視窗的視窗控制代碼
wnd := FindWindow(sTrayWindow, nil);
if (TCheckBox(Sender).Name)= 'CheckBox2' then
wnd := FindWindowEx(wnd, 0, sStartButton, nil);
if (TCheckBox(Sender).Name)= 'CheckBox3' then
wnd := FindWindowEx(wnd, 0, sTrayNotify, nil);
if (TCheckBox(Sender).Name)= 'CheckBox4' then begin
wnd := FindWindowEx(wnd, 0, sAppSwitchBar, nil);
wnd := FindWindowEx(wnd, 0, sAppSwitch, nil);
end;
if (TCheckBox(Sender).Name)= 'CheckBox5' then begin
wnd := FindWindowEx(wnd, 0, sTrayNotify, nil);
wnd := FindWindowEx(wnd, 0, sTrayClock, nil);
end;
if (TCheckBox(Sender).Name)= 'CheckBox6' then begin
wnd := FindWindow(sProgman, nil);
wnd := FindWindowEx(wnd, 0, sDesktopIcon, nil);
end;
if (TCheckBox(Sender).Name)= 'CheckBox7' then begin
wnd := FindWindowEx(wnd, 0, sAppSwitchBar, nil);
wnd := FindWindowEx(wnd, 0, sAppIcon, nil);
end;
if TCheckBox(Sender).Checked then
ShowWindow (wnd, SW_HIDE)
Else
ShowWindow (wnd, SW_SHOW);
end;
end.
運行程式,分別點擊不同的選擇框,可以分別隱藏工作列或工作列上的不同部分。
下面再來介紹如何操控案頭表徵圖。設定表徵圖文本的背景和顏色以及設定表徵圖的排列。通過上面的介紹
上面我們知道,Windows的案頭也是一個視窗,不同的它是一個ListView類視窗,對於ListView類視窗,有
一系列的以LVM_開頭的訊息,通過Windows API函數SendMessage向ListView類視窗發送這些訊息就可以控
制視窗的一些屬性,而且在Delphi中還有一系列的以ListView_開頭的函數,這些函數可以代替LVM_類訊息。
具體的範例如下:首先建立一個新的Delphi工程,然後在Form1中加入兩個CommandButton控制項,然後在
Form1中加入以下的代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls,Commctrl;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure SetDesktopIconColor(Forground, Background: TColor; Trans: Boolean);
var
Window: HWND;
begin
Window := FindWindow('Progman', 'Program Manager');
file://找到桌面視窗
Window := FindWindowEx(Window, HWND(nil), 'SHELLDLL_DefView', '');
file://找到放置案頭表徵圖的ListView視窗
Window := FindWindowEx(Window, HWND(nil), 'SysListView32', '');
if Trans then file://設定透明的文字背景色
ListView_SetTextBkColor(Window, $ffffffff) // back color
else file://設定不透明的文字背景色
ListView_SetTextBkColor(Window, Background); // back color
ListView_SetTextColor(Window, Forground); // foreground color
file://重新繪製案頭表徵圖
ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
UpdateWindow(Window); file://重新繪製視窗
end;
procedure SetDeskTopIconArr(iWidth,iHeight:Integer);
var
Window: HWND;
i,i1,i2,iCount:integer;
begin
Window := FindWindow('Progman', 'Program Manager');
Window := FindWindowEx(Window, HWND(nil), 'SHELLDLL_DefView', '');
Window := FindWindowEx(Window, HWND(nil), 'SysListView32', '');
file://設定表徵圖與邊界的距離。
i1:=20;i2:=20;
file://獲得案頭表徵圖的個數
iCount:=ListView_GetItemCount(Window)-1;
for i:=0 to iCount do begin
file://設定表徵圖位置
ListView_SetItemPosition(Window,i,i1,i2);
i1:=i1+iWidth;
if i1>(Screen.Width-32) then begin
i1:=20;
i2:=i2+iHeight;
end;
end;
ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
UpdateWindow(Window);
end;
procedure SetDefaultIconColors;
var
Kind: Integer;
Color: TColor;
begin
Kind := COLOR_DESKTOP;
Color := GetSysColor(COLOR_DESKTOP);
SetSysColors(1, Kind, Color);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
file://你可以改變clWhite,clBlack為其它的顏色值看看
file://表徵圖文本顏色的變化
SetDesktopIconColor(clWhite,clBlack,True);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
file://設定表徵圖的間距為100個像素
SetDeskTopIconArr(100,100);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := '設定表徵圖文本顏色';
Button2.Caption := '設定表徵圖排列';
end;
end.
在上面的程式中,函數SetDesktopIconColor設定表徵圖文本的前景色彩、背景色和透明,參數ForeGround
BackGround分別指定文本的前景色彩和背景色,參數Trans指定文本的背景是否透明(如果有背景圖案的話)。
函數SetDeskTopIconArr排列案頭表徵圖,參數iWidth,iHeight分別指定表徵圖之間的橫向縱向距離。如果要使
SetDeskTopIconArr函數生效,就需要將案頭表徵圖的自動排文選項去掉。另外ListView類還有其它的控制訊息
利用這些訊息可以控制更多的案頭表徵圖選項。有興趣的朋友可以察看MSDN庫。
以上程式由Delphi5編寫,在Windows98 Windows2000下運行通過。