ShowWindow(Application.Handle, SW_HIDE);

解决方案 »

  1.   

    找到一篇文章,要例子留下 伊妹儿
    Windows 95 作为Wi n d o w s 家族的一个里程碑,不仅增加了系统的稳定性,更在易用性方面
    下了很大的功夫,其中任务栏的引入可以说是易用性方面的典范。系统运行的应用程序可以在
    任务栏的任务切换区有对应的按钮,用户可以简便、快捷地在应用程序间切换。通过任务栏的
    状态指示区,可以很方便地查看当前系统时间、调节声音大小、切换输入法等。Windows 95 也
    允许应用程序在状态指示区上放置图标,以指示应用程序目前的状态或者提醒用户某个事件的
    发生。现在,越来越多的应用程序,如拨号软件、网络监视软件、杀毒软件、字典等都把自己
    的图标加到状态指示区上。在用户享受如此方便快捷的服务的同时,程序员则更加关注此功能
    的实现方法,以使自己的产品立于不败之地。
    针对这个问题,我们提出分析及解决它的三个步骤如下。
    1. 在状态指示区上安装、更改、卸载图标
    Windows 95 是基于事件驱动机制的操作系统。任何一个控件都是通过发消息或对系统消息
    的处理来实现功能的。状态指示区实际上也是一个标准控件,对它的控制和操纵与其他的标准
    控件一样,也是通过发消息和处理消息进行的。应用程序通过系统功能调用S h e l l _ N o t i f y I c o n 向
    状态指示区发消息,它的函数原型如下:
    function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData)
    : BOOL; stdcall;
    其中参数d w M e s s a g e 是要发给状态指示区的消息,可以取以下三个值:
    • NIM_ADD 在状态指示区上增加一个图标。
    • NIM_MODIFY 修改一个状态指示区的图标。
    • NIM_DELETE 删除状态指示区的一个图标。
    L p D a t a 是指向T N o t i f y I c o n D a t a A 结构的指针,此结构是要增加的图标的信息。
    PNotifyIconData = ^TNotifyIconDataA
    TNotifyIconDataA = record
    cbSize : DWORD;
    Wnd : HWND;
    uID : UINT;
    uFlags : UINT;
    uCallbackMessage : UINT;
    hIcon : HICON;
    s z Tip : array [0..63] of AnsiChar;
    e n d ;
    各字段的含义如表1 6 - 6 所示。
    在安装图标时,需要对结构的每一个字段都赋值。而当更改、卸载图标时,有些字段则可
    以不赋值。当更改图标信息时,除设置需要更改的内容外,要把c b S i z e 、W n d 、u I D 设置成正
    确的值,还要按照更改的内容将u F l a g s 调到相应的位置。例如,只更改图标的提示信息时,把
    c b S i z e , W n d , u I D 设置为正确的值,s z Ti p 赋值为要更改成的提示信息,u F l a g s 赋值为4 即可。需
    要删除图标时,只需要把c b S i z e 、W n d 、u I D 设置成正确的值即可。
    2. 对状态指示区图标上鼠标事件的响应
    现在,我们已经在状态指示区上安装了自己的图标,但它并不产生任何实际效果。因为当
    应用程序接收到鼠标事件后,除了可以显示提示信息外,没有产生任何动作。我们现在要做的
    就是要响应图标上的鼠标事件。ഊ表16-6 TNotifyIconDataA 中各字段含义
    字段含义
    C b S i z e 记录T N o t i f y I c o n D a t a A 的大小,设置为SizeOf( TNotifyIconDataA)
    W n d 接收状态指示区鼠标事件的窗口的句柄,例如: F o r m 1 . H a n d l e
    U I D 图标的I D (状态指示区鼠标事件的w P a r a 参数的值)
    U F l a g s 此条消息的有效范围(低三位有效), 取值如下:
    NIF_MESSAGE: 0x1 // uCallbackMessage 参数有效
    NIF_ICON: 0x2 // hIcon is valid 参数有效
    NIF_TIP: 0x4 // szTip is valid 参数有效
    U C a l l b a c k M e s s a g e 系统回送消息的I D
    H I c o n 显示在状态指示区上的图标的句柄
    S z Ti p 鼠标移动到图标上时系统显示的提示信息
    当在图标上移动、点击时,状态指示区会向应用程序发送如下的消息:
    messageID = uCallbackMessage
    wParam = uID
    lParam = mouse event (如: W M _ L B U T TO N D O W N )
    只需在主窗口的定义中,声明一个过程来响应这个消息,在它的实现部分就可以对消息进
    行处理了。
    3. 隐藏任务切换区的应用程序按钮
    完成了上面这些工作以后,已经可以在状态指示区成功地安装上图标,而且也可以响应图
    标上的事件了。但在状态指示区显示应用程序图标的同时,任务切换区也存在此应用程序的按
    钮,如何让它不出现在任务切换区上呢?这里又要提到一个系统调用S h o w Wi n d o w ,它的原型
    如下:
    function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;
    其中参数的含义如表1 6 - 7 所示。
    当一个应用程序的所有窗口都隐藏时,它
    的任务按钮就不显示。在用户选取状态指示
    区的图标时,再让某一个窗口激活就可以了。
    例程S16_27 该例程(运行界面如图1 6 - 4 5
    所示)说明了任务栏编程的基本过程。
    程序实现的功能是:程序运行时在状态指示区上安装一个图标,用户右击此图标,则弹出
    一个菜单。选取相应菜单项时,将执行该菜单项对应的程序,选取“关闭”菜单项时,卸载状
    态指示区的图标。
    图16-45 运行例程S16_28 时指示区图标和弹出菜单的两种状态
    具体实现过程如下:
    1) 新创建一个应用程序工程。创建两个窗体,窗体F o r m 1 为隐藏窗体,不显示出来,窗体
    F o r m 2 为可以显示的窗体。
    在F o r m 1 中放置一个T P o p u p M e n u 组件,参照图1 6 - 4 5 作图定制弹出菜单。三个菜单项的
    422 基本第三部分Delphi 高级编程技术
    下载
    表16-7 ShowWi n d o w 函数中各参数的说明
    参数说明
    H W n d 要改变显示状态的窗口的句柄
    N C m d S h o w 窗口要改变成为的显示状态
    S W _ H I D E 隐藏本窗口,激活另一个窗口
    S W _ S H O W 激活本窗口ഊN a m e 属性和C a p t i o n 属性如表1 6 - 8 所示。
    在窗体F o r m 2 上添加一个M a i n M e n u 组件,并在其中设置一个C a p t i o n 属性为“关闭( C )”的
    菜单命令。
    表16-8 例程S 1 6 _ 2 7 中两个窗体及其组件的属性设置
    控件名称属性设置控件名称属性设置
    F o r m 1 Caption: 隐藏窗口A p p I t e m Caption: 显示应用程序窗口( & S ) . . .
    BorderStyle: bsNone E n a b l e O r D i s a b l e Caption: 禁止使用( & D )
    F o r m 2 Caption: 应用程序窗口E x i t I t e m Caption: 退出( & X )
    2) 为了使用Windows API 函数S h e l l _ N o t i f y I c o n ,在U n i t 1 . p a s 文件的u s e s 语句中添加s h e l l a p i
    单元,并为图标和消息定义一些常量。另外,在类T F o r m 1 的定义中,添加对任务栏的状态指
    示区进行操作时要使用的一些函数和变量。
    具体如下:
    unit Unit1;
    . . .
    u s e s
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Menus, shellapi ;
    c o n s t
    ICON_ID = 1;
    MI_ICONEVENT = WM_USER + 1;
    t y p e
    TForm1 = class(TForm)
    . . .
    p r i v a t e
    { Private declarations }
    NormalIcon, DisabledIcon:TIcon;
    Status:Boolean; // 标识"允许使用"还是"禁止使用"
    procedure InstallIcon;
    procedure ChangeIcon(s:Boolean);
    procedure UnInstallIcon;
    procedure IconOnClick(var message: TMessage); message MI_ICONEVENT;
    p u b l i c
    . . .
    i m p l e m e n t a t i o n
    uses Unit2;
    {$R *. D F M }
    { TForm1 }
    procedure TForm1.ChangeIcon(s: Boolean);
    v a r
    IconData: TNotifyIconData;
    b e g i n
    IconData.cbSize := SizeOf(IconData);
    第16 章章其他编程技术章名423 下载ഊIconData.Wnd := Handle;
    IconData.uID := ICON_ID;
    if s=False then // 禁止使用
    b e g i n
    IconData.hIcon := DisabledIcon.Handle;
    S t a t u s : = F a l s e ;
    A p p I t e m . E n a b l e d : = F a l s e ;
    e n d
    else // 允许使用
    b e g i n
    IconData.hIcon := Normalicon.Handle;
    S t a t u s : = Tr u e ;
    A p p I t e m . E n a b l e d : = Tr u e ;
    e n d ;
    IconData.uFlags := NIF_ICON;
    S h e l l _ N o t i f y I c o n ( N I M _ M O D I F Y, @IconData);
    e n d ;
    procedure TForm1.IconOnClick(var message: TMessage);
    v a r
    p : TPoint;
    b e g i n
    // 如果按下的是鼠标左键,并且允许显示,则显示F o r m 2
    if ( (message.lParam = WM_LBUTTONDOWN) and (Status=True) ) then
    F o r m 2 . S h o w ;
    // 如果按下的是鼠标右键,则显示弹出菜单
    if (message.lParam = WM_RBUTTONDOWN) then
    b e g i n
    GetCursorPos( p );
    PopupMenu1.Popup(p.x ,p.y );
    e n d ;
    e n d ;
    // 安装图标
    procedure TForm1.InstallIcon;
    v a r
    IconData: TNotifyIconData;
    b e g i n
    NormalIcon := TIcon.Create;
    DisabledIcon := TIcon.Create;
    NormalIcon.LoadFromFile( 'normal.ico' ); // 允许使用状态下的图标
    DisabledIcon.LoadFromFile( 'disable.ico' ); // 禁止使用状态下的图标
    IconData.cbSize := SizeOf( IconData );
    IconData.Wnd := Handle;
    IconData.uID := ICON_ID;
    IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    IconData.uCallBackMessage := MI_ICONEVENT;
    IconData.hIcon := NormalIcon.Handle;
    I c o n D a t a . s z Tip := '这是任务栏的状态指示区上加图标的例程' ;
    Shell_NotifyIcon( NIM_ADD, @IconData );
    e n d ;
    424 基本第三部分Delphi 高级编程技术
    下载ഊ// 卸载图标
    procedure TForm1.UnInstallIcon;
    v a r
    IconData: TNotifyIconData;
    b e g i n
    IconData.cbSize := SizeOf( IconData );
    IconData.Wnd := Handle;
    IconData.uID := ICON_ID;
    Shell_NotifyIcon( NIM_DELETE, @IconData );
    e n d ;
    注意:在类T F o r m 1 中定义了函数或过程原型后,只要按下S h i f t + C t r l + C ,系统会自动添加
    函数体或过程体。
    3) 下面在F o r m 1 窗体的O n C r e a t e 事件、O n C l o s e 事件及O n A c t i v a t e 事件的处理过程中进行一
    些初始化工作和清理工作。具体如下:
    procedure TForm1.FormCreate(Sender: TO b j e c t ) ;
    b e g i n
    // 安装图标并隐藏主窗体
    S t a t u s : = Tr u e ;
    I n s t a l l I c o n ;
    ChangeIcon( True );
    S h o w Window( Application.Handle,SW_HIDE );
    S e t WindowLong( Application.Handle,GWL_EXSTYLE,WS_EX_TO O LWINDOW );
    e n d ;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    b e g i n
    // 卸载图标并释放图标资源
    U n I n s t a l l I c o n ;
    N o r m a l I c o n . F r e e ;
    D i s a b l e d I c o n . F r e e ;
    e n d ;
    procedure TForm1.FormActivate(Sender: TO b j e c t ) ;
    b e g i n
    // 隐藏F o r m 1
    F o r m 1 . w i d t h : = 0 ;
    F o r m 1 . H e i g h t : = 0 ;
    S h o w Window( Application.Handle, SW_HIDE );
    e n d ;
    4) 现在添加弹出菜单的O n C l i c k 事件的处理过程如下:
    procedure TForm1.AppItemClick(Sender: TO b j e c t ) ;
    b e g i n
    F o r m 2 . S h o w ;
    e n d ;
    procedure TForm1.EnableOrDisableClick(Sender: TO b j e c t ) ;
    b e g i n
    i f ( S t a t u s = Tr u e ) t h e n
    第16 章章其他编程技术章名425 下载ഊb e g i n
    ChangeIcon( False );
    E n a b l e O r D i s a b l e . C a p t i o n : = '允许使用( & Y ) ' ;
    e n d
    e l s e
    b e g i n
    ChangeIcon( True );
    E n a b l e O r D i s a b l e . C a p t i o n : = '禁止使用( & D ) ' ;
    e n d ;
    e n d ;
    procedure TForm1.ExitItemClick(Sender: TO b j e c t ) ;
    b e g i n
    C l o s e ;
    e n d ;
    5) 最后添加F o r m 2 窗体中“关闭( C )”菜单的O n C l i c k 事件的处理过程如下:
    procedure TForm2.C1Click(Sender: TO b j e c t ) ;
    b e g i n
    c l o s e ;
    e n d ;
    426 基本第三部分Delphi 高级编程技术
      

  2.   

    不知这样能不能满足你:
    把窗体的Bordstyle设为bsDialog,另外把caption属性框置为空!
      

  3.   

    哦~~你的意思……
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    //ShowWindow(Application.Handle, SW_HIDE);
      Application.Icon := nil;
      Application.Title := '';
    end;
      

  4.   

    to rh
    这种办法可能不行,我试过
    我的意思是任务栏上有一个空的按钮,无图标、无caption(这点好办),按钮能切换任务
    始终它都有图标(不好办)