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] 下一页 没有相关教程
|