分享
 
 
 

完全控制你的Windows桌面

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

完全控制你的Windows桌面

对于Windows的桌面界面相信大家已经十分熟悉了,占据屏幕大半部分的是桌面,在上面排列的是桌面图标。

任务栏一般位于桌面的下面,也可以在桌面其它边缘。在最左边是“开始按钮”,接下来是“快速启动按钮”区、

程序按钮区,再下来是任务栏图标区,在上面一般会有音量调节图标和输入法调节图标和时钟等。

本文首先介绍如何隐藏任务栏中的上面介绍的部分。我们知道利用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下运行通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有