完全控制你的Windows桌面 (轉)

worldblog發表於2007-12-04
完全控制你的Windows桌面 (轉)[@more@]

完全控制你的桌面
  對於Windows的桌面介面相信大家已經十分熟悉了,佔據螢幕大半部分的是桌面,在上面排列的是桌面圖示。
工作列一般位於桌面的下面,也可以在桌面其它邊緣。在最左邊是“開始按鈕”,接下來是“啟動按鈕”區、
按鈕區,再下來是工作列圖示區,在上面一般會有音量調節圖示和輸入法調節圖示和時鐘等。
  本文首先介紹如何隱藏工作列中的上面介紹的部分。我們知道利用Windows的ShowWindow可以隱藏或
者顯示視窗,關鍵是如何得到視窗的控制程式碼。在Windows下的每一個視窗不但有一個視窗控制程式碼標示視窗,還有一個稱
為類名的字串標示視窗。如果知道視窗的類名,透過FindWindow函式就可以獲得視窗的控制程式碼。而Windows桌面
本身就是一個視窗,桌面圖示區、工作列以及工作列下的開始按鈕等都是它的子視窗。我們可以透過FindWindowEx
函式來尋找這些視窗。再利用ShowWindow函式隱藏或顯示視窗。下面透過一個的範例來演示如何控制工作列。
  首先建立一個新的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: T);
  private
  procedure CheckButtonClick(Sender:TObject);
  { Private declarations }
  public
  { Public declarations }
  end;
Const
義不同視窗的類名
sTrayWindow = '_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;

個CheckBox控制元件的Click處理函式
procedure TForm1.CheckButtonClick(Sender:TObject);
var
  i:Integer;
begin
  到工作列視窗的視窗控制程式碼
  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_H)
  Else
  ShowWindow (wnd, SW_SHOW);
end;
end.

  執行程式,分別點選不同的選擇框,可以分別隱藏工作列或工作列上的不同部分。

  下面再來介紹如何操控桌面圖示。設定圖示文字的背景和顏色以及設定圖示的排列。透過上面的介紹
上面我們知道,Windows的桌面也是一個視窗,不同的它是一個ListView類視窗,對於ListView類視窗,有
一系列的以LVM_開頭的訊息,透過Windows API函式SendMessage向ListView類視窗傳送這些訊息就可以控
制視窗的一些屬性,而且在Delphi中還有一系列的以ListView_開頭的函式,這些函式可以代替LVM_類訊息。
  具體的範例如下:首先建立一個新的Delphi工程,然後在Form1中加入兩個Commanutton控制元件,然後在
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');
  到桌面視窗
  Window := FindWindowEx(Window, HWND(nil), 'SHELLDLL_DefView', '');
  到放置桌面圖示的ListView視窗
  Window := FindWindowEx(Window, HWND(nil), 'SysListView32', '');

  if Trans then  置透明的文字背景色
  ListView_SetTextBkColor(Window, $ffffffff) // back color
  else  置不透明的文字背景色
  ListView_SetTextBkColor(Window, Background); // back color

  ListView_SetTextColor(Window, Forground); // foreground color
  新繪製桌面圖示
  ListView_RedrawItems(Window, 0, ListView_GetItemCount(Window) - 1);
  UpdateWindow(Window);  新繪製視窗
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', '');

  置圖示與邊界的距離。
  i1:=20;i2:=20;

  得桌面圖示的個數
  iCount:=ListView_GetItemCount(Window)-1;
  for i:=0 to iCount do begin
  置圖示位置
  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 := GetSylor(COLOR_DESKTOP);
  SetSysColors(1, Kind, Color);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  可以改變clWhite,clBlack為其它的顏色值看看
  標文字顏色的變化
  SetDesktopIconColor(clWhite,clBlack,True);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  置圖示的間距為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 下執行透過。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987934/,如需轉載,請註明出處,否則將追究法律責任。

相關文章