QQ登陆画面的最小化显示机制(使程序不在任务栏显示)

来源:互联网 发布:高考状元笔记淘宝 编辑:程序博客网 时间:2024/04/28 02:47
2007-05-21 19:17

QQ登陆画面的最小化显示机制(使程序不在任务栏显示)

本页例程下载

怎么使自己的程序不在任务栏显示?去网上找一下答案,关于Delphi的无非是以下一句:

SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOWINDOW);

在Application窗口的窗口属性中添加工具窗口属性,这样它就不会在任务栏显示了.在Delphi中,主窗口最小化的时候,实际上应该是隐藏了,只有Application窗口显示出来,这时候在屏幕的左下角就会出现最小化的一个标题栏:

系统菜单的样子:我感觉这样很不好看,这就是标准的Windows中的ToolWindow.QQ的登陆界面在运行时也不出现在任务栏,但是它最小化之后是什么样子呢?系统菜单的样子:这样比ToolWindow风格漂亮的多了,但是这是怎么实现的呢?我们来研究研究.使用VC的Spy++工具找到登陆界面窗口这是一个对话框(#32770)的窗口,试着定位到它的密码框,发现这个编辑框居然是个对话框!怪不得功能这么强大呢:还有"隐身登陆"和"自动登陆"两个复选框居然是Button:不过这不是我们要关注的,下面我们看一写登陆界面窗口的窗口属性:发现登陆界面是有一个父窗口的,也就是说登陆界面不是单独存在的,它很有可能只是一个弹出窗口,点击父窗口的句柄,查看父窗口的属性:这个父窗口是一个不可用的不可见的后台窗口,我们使用ShouWindow函数把它强制显示出来:图中的黑线标识的部分是父窗口句柄,看到左上角那个标题为ChenkIdle的窗口了吧,那个就是父窗口,因为正常使用中它不会显示,所以连背景刷子都没有定义,它的界面是不重新绘制的,它只是一个有标题的父窗口而已.父窗口显示以后,尝试用鼠标去激活它,发现登陆界面窗口在闪烁,登陆界面分明就是一个模态弹出的窗口.父窗口率先启动,然后把登陆界面模态显示出来,自己始终不可见.我们使用Delphi尝试模拟这种效果,首先设计不可见的也不在任务栏显示的父窗口,窗体的大小无关紧要:添加一个Form2为弹出窗口,这个窗口会由Form1弹出来,和QQ登陆界面的地位相同,注意在这个窗口关闭时通知它的父窗口关闭:下面是Form1弹出Form2的问题,直接在Form1的创建过程中弹出Form2这样不行,因为这样的效果会比较像Form2成了Application的主窗体,最小化之后依然是ToolWindow的样子.还容易想到的是在Form1的OnShow中添加代码,但是这样也行不通,因为Form1根本就不会显示出来,它是不可见的.这里我采用了使用定时器的办法,在Form1中添加一个定时器,响应的时间间隔很小,而且只需响应一次就够了.在响应代码中使这个不再有用的定时器无效,然后再弹出Form2:注意在这里Form在动态创建的,首先要把它从工程的自动创建窗体列表中把它删除.这样编译运行我们的程序,最小化它,发现这正是我们想要的效果:多运行几个看看,最小化的小窗口的排列是有序的,这些都由系统自动完成: