完全控制你的Windows案頭

來源:互聯網
上載者:User

完全控制你的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下運行通過。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.