打印本文 打印本文 关闭窗口 关闭窗口
Windows通知栏图标高级编程概述
作者:武汉SEO闵涛  文章来源:敏韬网  点击数4066  更新时间:2009/4/23 18:34:16  文章录入:mintao  责任编辑:mintao
sp;  StrPCopy(szInfoTitle, Title);

      dwInfoFlags := aBalloonIconTypes[IconType];

    end {with};

    Result := Shell_NotifyIcon(NIM_MODIFY, @FIconData)

  end

  else

    result := True;

end; //end of procedure Balloon

//---------------------------------------------------}

 

1.2 气泡提示的事件通知

由于新风格提示的引入,通知栏图标的消息通知也相应增加,如果通知栏图标实现了气泡提示,那么当用户将鼠标指针移动到通知栏图标上时,Windows外壳会向通知栏应用程序送出如下四个消息中的一个或多个。

 

NIN_BALLOONSHOW

当气泡提示显示后外壳发送此消息

NIN_BALLOONTIMEOUT

当气泡提示由于超时而消失时外壳发送此消息

NIN_BALLOONHIDE

当气泡提示消失时(比如通知栏图标被删除)外壳发送此消息,但气泡提示由于超时而消失不会产生此消息

NIN_BALLOONUSERCLICK

当用户点击鼠标时(点击气泡提示和通知栏图标均可)外壳发送此消息

 

Delphi强大的消息封装机制支持下,可以方便地将上述四个消息封装为四个事件供开发人员使用。简单来说就是在控件中一个隐藏窗口(创建隐藏窗口的方法可查阅相关文章,此处略过)的窗口消息处理过程中接收这四个消息并分别映射到四个事件,示范代码如下:

 

procedure TEoCSysTray.WndProc(var Msg: TMessage);

begin

……

  case Msg.LParam of

    WM_LBUTTONDOWN:

……

    WM_RBUTTONDBLCLk:

……

  else if Msg.lParam = NIN_BALLOONSHOW then   //气泡提示显示后

  begin

    if Assigned(FOnBalloonShow) then

      FOnBalloonShow(Self)

  end

  else if Msg.lParam = NIN_BALLOONHIDE then   //气泡提示由于超时而消失

  begin

    if Assigned(FOnBalloonHide) then

      FOnBalloonHide(Self)

  end

  else if Msg.lParam = NIN_BALLOONTIMEOUT then    //气泡提示消失

  begin

    if Assigned(FOnBalloonTimeOut) then

      FOnBalloonTimeOut(Self)

  end

  else if Msg.lParam = NIN_BALLOONUSERCLICK then  //用户点击鼠标

  begin

    if Assigned(FOnBalloonClick) then

      FOnBalloonClick(Self)

  end

  else

    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);

  end;

end; //end of procedure WndProc

 

 

2 Windows发生错误导致外壳Explorer重启时图标的重建

相信很多Windows用户都碰到过这种情况:运行某个程序时出现意外错误,导致外壳程序Explorer.exe崩溃而发生重启(即Explorer.exe被关闭后重新运行),任务栏也在消失后重新生成,但应用程序在通知栏添加的图标消失了,虽然这些程序仍在运行,但再也无法通过通知栏图标与用户交互。为避免这种情况出现,Windows提供了相应的机制。

在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当任务栏建立后,外壳会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串“TaskbarCreated”为参数向系统注册获得的,应用程序窗口接收到该消息后就应该重新添加的通知栏图标。

Delphi中实现过程如下:

 

initialization

  MsgTaskbarRestart := RegisterWindowMessage(‘TaskbarCreated’);

 

上一页  [1] [2] [3] [4] [5]  下一页

打印本文 打印本文 关闭窗口 关闭窗口