Delphi全面控制Windows任务栏
使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏。从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以 及任务栏时钟。与其它Windows应用程序相同,任务栏程序(systray.exe)由几个不同的窗体 组成,这些窗体是具有各自的窗口类名、显示方式等信息。因此,只要得到有关窗口信息, 即可通过编程全面控制Windows任务栏的不同区域。
1. 编程思想
(1)任务栏窗体的窗口信息为:
①任务栏的窗口类名是:ShellTrayWnd。
②开始按钮的窗口类名是:Button。
③应用程序切换区的窗口类名是:ReBarWindow32。
④任务栏通知区的窗口类名是:TrayNotifyWnd。
⑤任务栏时钟的窗口类名是:TrayClockWClass。
(2)调用FindWindow函数得到任务栏的窗口句柄。
(3)调用FindWindowEx函数得到任务栏各子区域的窗口句柄。
(4)根据窗口句柄,调用ShowWindow函数控制任务栏各区域显示或隐藏 (show/hide);调用En ableWindow函数控制任务栏各区域有效或无效(enabled/disabled)。
2. 编程方法
(1)在Delphi3.0 IDE中新建工程Project1, Project1中包含Form1, 窗体如下图所示:
(2)定义窗口句柄数组:Wnd:array[0..4] of THandle;
(3)GetHandles过程代码如下:
procedure TForm1.GetHandles;
begin
//得到Tray Bar的窗口句柄;
Wnd[0]:=FindWindow(′ShellTrayWnd′,nil);
//得到开始按钮的窗口句柄;
Wnd[1]:=FindWindow(′ShellTrayWnd′,nil);
Wnd[1]:=FindWindowEx(Wnd[1],HWND(0),′Button′,nil); //得到应用程序切换区的窗口句柄;
Wnd[2]:=FindWindow(′ShellTrayWnd′,nil);
Wnd[2]]:=FindWindowEx(Wnd[2],HWND(0),′ReBarWindow32′,nil);
//得到任务栏通知区的窗口句柄;
Wnd[3]:=FindWindow(′ShellTrayWnd′,nil);
Wnd[3]:=FindWindowEx(Wnd[3],HWND(0),′TrayNotifyWnd′,nil);
//得到任务栏时钟的窗口句柄;
Wnd[4]:=FindWindow(′ShellTrayWnd′,nil);
Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayNotifyWnd′,nil);
Wnd[4]:=FindWindowEx(Wnd[4],HWND(0),′TrayCLockWClass′,nil);
end;
(4)EnableOrDisable过程代码如下:
procedure TForm1.EnableOrDisable(Sender:TOBject);
begin
GetHandles;
if TCheckBox(Sender). Checked then
case TCheckBox(Sender). Tag of
0: EnableWindow(Wnd[0], False);
1: EnableWindow(Wnd[1], False);
2: EnableWindow(Wnd[2], False);
3: EnableWindow(Wnd[3], False);
4: EnableWindow(Wnd[4], False);
end
else
case TCheckBox(Sender). Tag of
0: EnableWindow(Wnd[0], True);
1: EnableWindow(Wnd[1], True);
2: EnableWindow(Wnd[2], True);
3: EnableWindow(Wnd[3], True);
4: EnableWindow(Wnd[4], True);
end;
end;
(5)HideOrShow过程代码如下:
procedure TForm1.HideOrShow(Sender:TObject);
begin
GetHandles;
if TCheckBox(Sender). Checked then
case TCheckBox(Sender). Tag of
0: ShowWindow(Wnd[0],SWHIDE);
1: ShowWindow(Wnd[1],SWHIDE);
2: ShowWindow(Wnd[2],SWHIDE);
3: ShowWindow(Wnd[3],SWHIDE);
4: ShowWindow(Wnd[4],SWHIDE);
end
else
case TCheckBox(Sender). Tag of
0: ShowWindow(Wnd[0],SWShow);
1: ShowWindow(Wnd[1],SWShow);
2: ShowWindow(Wnd[2],SWShow);
3: ShowWindow(Wnd[3],SWShow);
4: ShowWindow(Wnd[4],SWShow);
end;
end;
(6)FormClose事件代码如下://将Windows任务栏恢复到正常状态;
procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction);
var i:Integer;
begin
for i:=0 to 4 do
begin
EnableWindow(Wnd[i],True);
ShowWindow(Wnd[i],SWShow);
end;
end;
(7)按F9运行程序。以上程序在Delphi3.0/4.0、Windows95/98简体中文版环境下调试通过。
(8)说明:本文所述方法同样适用于VB、VC、BC、C++Builder等编程工具,但应注意语法、 变量类型等不同要求。
Delphi全面控制Windows任务栏的更多相关文章
- Delphi 全面控制Windows任务栏
核心提示:使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏. 使用Windows95/NT/98操作系统的用户知道:Windows正常启动 ...
- 利用Delphi全面控制Windows任务栏
使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏.从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮.应用程序 ...
- 教程-隐藏/显示任务栏-程序不在任务显示-全面控制Windows
1.隐藏任务条 var h:THandle; //变量h:=FindWindow('Shell_TrayWnd',nil);ShowWindow(h,SW_hide); 2.显示任务条h:=Find ...
- delphi 获取windows任务栏的高度
function GetWinTrayWnd: Integer; // 获取windows任务栏高度 var TrayWnd: HWnd; //任务栏句柄 Rec : TRect; begin Tra ...
- C#实现控制Windows系统关机、重启和注销的方法:
shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设 ...
- C#实现控制Windows系统关机、重启和注销的方法
shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设 ...
- Delphi里的Windows消息(可查MSDN指定位置)
各种控件的通知消码和控制消息可由MSDN-> Platform SDK-> User Interface Services->Windows User Interface->C ...
- 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)
浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...
- 利用C# Winform做Windows系统任务栏
最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...
随机推荐
- Eclipse编辑Spring配置文件xml时自动提示类class包名
第一步,先查看下自己的Eclipse是什么版本,步骤如下: 1.1 点击Eclipse菜单‘Help -> About Eclipse’,如下图: 1.2 点击Eclipse图标如下,看清楚哦 ...
- shell脚本进行设置启动/关闭
vi /etc/init.d/confluence ----------------------------- #!/bin/bash# chkconfig: 2345 85 15# Provides ...
- k8s集群的搭建之三:flannel
一介绍 flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具.它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip:让所有的容器认为大家在 ...
- 重新开始学习C++
从2002年,大二的那个夏天开始,就接触了C++这门语言,大学那会就是在老师不停教育下,背诵C++的各种特征,完全不知道C++干嘛用的,当然自然也是不知道汇编语言,C语言是干嘛用的,老师让学就学吧.那 ...
- HTML5新表单新功能解析
HTML5新增了很多属性功能.但是有兼容性问题,因为这些表单功能新增的.我这里做了一个简单的练习,方便参考.如果完全兼容的话,那我们写表单的时候就省了很多代码以及各种判断. <!DOCTYPE ...
- 「ZJOI2019」线段树 解题报告
「ZJOI2019」线段树 听说有人喷这个题简单,然后我就跑去做,然后自闭感++,rp++(雾) 理性分析一波,可以发现最后形成的\(2^k\)个线段树,对应的操作的一个子集,按时间顺序作用到这颗线段 ...
- bzoj1050题解
[解题思路] 先把边按边权排序,然后O(m)暴力枚举最小边,对于每条最小边,将比其大的边按序加入直到起终点连通,此时最大边权/最小边权即为选择该最小边情况下的最小比值.复杂度O(m(m+n)α(n)) ...
- 兼容软件,Wine安装,Crossover安装,
EL6 (RHEL6 and SL6) Required packages for proper building of 32-bit Wine on 64-bit EL6 yum install - ...
- linux python3 venv 虚拟环境报错 [-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.
解决办法: 先创建没有pip的虚拟环境,然后启动虚拟环境后,再安装pip 办法一: 亲测失败了... python3 -m venv --without-pip py36env 办法二 sudo ap ...
- Java 反射获取私有方法
通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...