上一篇 | 下一篇

如何做一个SYSTRAY程序

发布: 2008-6-26 20:33 | 作者: admin | 来源: | 查看: 0次

width="84%">如何做一个SYSTRAY程序

Windows 95作为Windows家族的一个里程碑,不仅增加了系统的稳定性,更在易用性上下了很大的功夫。其中任务栏的引入可以说是易用性方面的典范。系统运行的每一个应用程序都在任务栏的任务切换区有对应的按钮,用户可以简便、快捷地在应用程序间切换。通过任务栏的状态指示区,用户可以很方便地到当前系统时间,调节声音大小,切换输入法等。Windows

95也允许应用程序在状态指示区上放置图标,以指示应用程序目前的状态,或者提醒用户某个事件的发生。现在,越来越多的应用程序,如拨号软件、网络监视软件、杀毒软件、字典等都把自己的图标加到状态指示区上。在大家享受如此方便快捷的服务的同时,作为程序员则更加关注此功能的实现方法,以使自己的产品立于不败之地。

针对这个问题,我查阅了大量的技术资料及Delphi 3.0所带的源代码,成功地解决了它。以下是对这个问题分析及解决它的三个步骤。

  1.在状态指示区上安装、更改、卸载图标

  

Windows 95是基于事件驱动机制的操作系统。任何一个控件都是通过发消息或对系统消息的处理来实现功能的。状态指示区实际上也是一个标准控件。对它的控制和操纵,与其他的标准控件一样,也是通过发消息和处理消息进行的。应用程序通过系统功能调用Shell_NotifyIcon向状态指示区发消息,它的函数说明如下(摘自Delphi的Source\RTL\WIN\shellapi.pas文件):

  function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;

  其中:

  

   dwMessage:要发给状态指示区的消息,可以取以下三个值:

   NIM_ADD 在状态指示区上增加一个图标

   NIM_MODIFY 修改一个状态指示区的图标

   NIM_DELETE 删除状态指示区的一个图标

   lpData:指向TNotifyIconDataA结构的指针,此结构是要增加的图标的信息。

   PNotifyIconData = ^TNotifyIconDataA

   TNotifyIconDataA = record

   cbSize : DWORD;

   Wnd : HWND;

   uID : UINT;

   uFlags : UINT;

   uCallbackMessage : UINT;

   hIcon : HICON;

   szTip : array [0..63] of AnsiChar;

   end;

  

   各字段的含义如下所述:

   cbSize:记录TNotifyIconDataA的大小,设置为SizeOf( TNotifyIconDataA);

   Wnd:接收状态指示区鼠标事件的窗口的句柄,例如:Form1.Handle;

   uID:图标的ID(状态指示区鼠标事件的wPara参数的值);

   uFlags:此条消息的有效范围(低三位有效)

   NIF_MESSAGE 0x1 // uCallbackMessage参数有效

   NIF_ICON 0x2 // hIcon is valid参数有效

   NIF_TIP 0x4 // szTip is valid参数有效

   uCallbackMessage:系统回送消息的ID;

   hIcon:显示在状态指示区上的图标的句柄;

   szTip:鼠标移动到图标上时系统显示的提示信息。

  

 

  

在安装图标时,需要对结构的每一个字段都赋值。而当更改、卸载图标时,则有些字段可以不赋值。当更改图标信息时,除设置需要更改的内容外,要把cbSize,Wnd,uID设置成正确的值,还要按照更改的内容将uFlags调到的相应的位置。例如,只更改图标的提示信息时,把cbSize,Wnd,uID设置为正确的值,szTip赋值为要更改成的提示信息,uFlags赋值为4即可。需要删除图标时,只需要把cbSize,Wnd,uID设置成正确的值即可。

   2.对状态指示区上图标鼠标事件的响应

  

现在,我们已经在状态指示区上安装了自己的图标,但它并不产生任何实际效果。因为当应用程序接收到鼠标事件后,除了可以显示提示信息外,没有产生任何动作。我们现在要做的就是要响应图标上的鼠标事件。

  

当用户在你的图标上移动、点击时,状态指示区会向应用程序发送如下的消息:

   messageID = uCallbackMessage

   wParam = uID

   lParam = mouse event (如:WM_LBUTTONDOWN)

  

我们只需在主窗口的定义中,声明一个过程,来响应这个消息,在它的实现部分就可以对消息进行处理了。

   3.隐藏任务切换区的应用程序按钮

  

完成了上面这些工作以后,我们已经可以在状态指示区成功地安装上图标,而且也可以响应图标上的事件了。美中不足的是,在状态指示区显示应用程序图标的同时,任务切换区也存在此应用程序的按钮,怎么让它不出现在任务切换区上呢?这里又要提到一个系统调用ShowWindow,它的说明如下(摘自Delphi的Source\RTL\WIN\

   windows.pas文件):

   function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;

   其中:

   hWnd:要改变显示状态的窗口的句柄;

   nCmdShow:窗口要改变成为的显示状态:

   SW_HIDE 隐藏本窗口,激活另一个窗

字号: | 推荐给好友

31/3123>

评分:0

我来说两句