全面控制Windows任务栏
使用Windows95/NT/98操作系统的用户知道:Windows正常启动后,在电脑屏幕下方出现一块 任务栏。从系统功能角度而言,整个任务栏包括几个不同的子区域,从左至右依次是:开始 按钮、应用程序切换区(Application Switch Bar)、任务栏通知区(Notification Area)以 及任务栏时钟。与其它Windows应用程序相同,任务栏程序(systray.exe)由几个不同的窗体 组成,这些窗体是具有各自的窗口类名、显示方式等信息。因此,只要得到有关窗口信息, 即可通过编程全面控制Windows任务栏的不同区域。
任务栏按钮没有句柄的,只能取按钮ID后,通过消息来隐藏,这是任务栏结构
Shell_TrayWnd
|- Button
|- TrayNotifyWnd
| |- TrayClockWClass
| \- ToolbarWindow32
\- ReBarWindow32
|- MSTaskSwWClass
| \- SysTabControl32
\- ToolbarWindow32
任务栏换栏是 SysTabControl32类的,只有依次取得上级窗口句柄才能逐次取得SysTabControl32
的句柄,然后通过消息取按钮id,但不知为什么取到ReBarWindow32的句柄后,始终无法取得MSTaskSwWClass
类控件的句柄,所以无法取SysTabControl32的句柄,哪位高手研究一下.
通过ShowWindow来隐藏窗口的任务栏图标是不持久的。某些动作会使任务栏图标重现。你可以将隐藏的应用程序窗口设为
Tool Window来移走程序的任务栏图标而避免它再次出现。Tool windows永远不会有任务栏图标。 使应用程序窗口成为一个Tool
Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。你可以调用API函数GetWindowLong和SetWindowLong来使
应用程序窗口成为一个Tool Window。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE);
dwExStyle |= WS_EX_TOOLWINDOW;
SetWindowLong(Application->Handle, GWL_EXSTYLE, dwExStyle);
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
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简体中文版环境下调试通过。
转载于:https://www.cnblogs.com/absolute8511/archive/2007/01/22/1649703.html
全面控制Windows任务栏相关推荐
- Windows任务栏上显示网页的超酷玩法!!!!!!!!!!!
Windows任务栏上显示网页的超酷玩法!!!!!!!!!!! 作者:lee1892 -----------整理者:lnboy 众所周知,windows的任务栏可以显示一个被称为QuickLaunch ...
- asp.net 控制windows服务
asp.net 控制windows服务 最近做一个小的项目,经理要求winform与web都可操作.于是将其做成服务,winform下调用很简单.asp.net下大部分过程是一样的.但需要涉及到用户的 ...
- 设置计算机关机静音,Shortcuts 捷径控制 Windows 电脑:静音开关、音量调节、待机、关机...
在 iPhone 上通过 Shortcuts 捷径控制 Windows 电脑:静音开关.音量调节.待机.关机 演示视频 : 教程: 一.使用方法: 1.Windows 上安装一个 SSH 服务器软件并 ...
- C#使用ServiceController控制windows服务
C#中,使用ServiceController类控制windows服务,使用之前要先添加引用:System.ServiceProcess,然后在命名空间中引用:using System.Service ...
- java控制系统音量_Java 控制 Windows 系统音量-Go语言中文社区
目录 1.使用 Java 来控制 Windows 系统音量,使用 JNA 调用 windows 底层 API 因为有点麻烦,所以这里采用纯 Java API结合 VBS 脚本的方式进行控制. 2.可以 ...
- bcb隐藏窗口_BCB隐藏Windows任务栏的方法
BCB隐藏Windows任务栏的方法 来源:互联网 宽屏版 评论 2006-01-09 12:27:01 void __fastcall TForm1::FormCreate(TObject *S ...
- 【Ansible】Ansible控制windows插件安装及运行error与解决方法
一. 问:因pip版本问题无法安装kerberos 答:安装提示需要先安装pip升级包 下载pip9.0.1升级包: ![1_2] 二.问:安装kerberos报错 答:需要先安装libkrb5开发包 ...
- 隐藏windows任务栏中的窗口显示
在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不 ...
- jQuery开发之windows边栏小工具开发(Gadget development)- wi...
为什么80%的码农都做不了架构师?>>> jQuery开发之windows边栏小工具开发(Gadget development)- windows小工具实现的电话薄查询工具 作 ...
最新文章
- tez 0.9.0 配置
- excel求期望_商务数据分析考试:决策树分析(Excel)-安聪
- Spring入门第五课
- Python+selenium 自动化-获取当前页面的url地址,打开指定的url地址
- 一文盘点数据行业的动态演变
- 三联《少年》创刊,各领域佼佼者畅言新知,帮少年建立思维素养体系!
- Js中Date的应用
- 特斯拉标准续航版Model Y为什么下架?马斯克这么回答
- 【SPI】java基础之SPI框架实现
- iOS 10 推送的简单使用
- Struts2 Result 类型和对应的用法详解 2
- 大数据学习入门级书籍推荐
- CYQ.Data V5 分布式自动化缓存设计介绍
- 使用vue实现的人物关系图谱
- 计算机科学与技术如何创新,计算机科学与技术专业创新能力的培养途径
- fastapi之tortoise-orm
- “双花”问题及解决之道
- UVALive 8076 Workout for a Dumbbell
- Linux中断——request_irq
- dockermount与volume的区别
热门文章
- Selenium不打开浏览器采爬取数据 Java
- 最近点对问题(分治法)
- 【小程序】【Tips】image 组件中 null 和 undefined 的区别和对策
- vista系统服务器,Vista系统中怎么设置IIS服务器
- html怎么显示数学公式,怎么使用html数学公式显示库MathJax - js笔记
- 网页没有横向滚动条_【第四课】网页里的表单
- python表示数字6_Python3 数字Number(六)
- ue4 运行禁用鼠标_从零开始——三:关闭电脑无用服务提高运行速度
- php sql获取字段名称,mssql获取字段名及注释,以及一系列问题
- ubuntu安装python下载包_Ubuntu安装Python的包管理工具Pip