返回列表 回复 发帖

Inno Setup 系统托盘图标插件 TrayIconCtrl


                                                                                                       

VER 1.1 修正一些错误,并作了一些小的调整。
引用来自  test.iss,2008-11-4 22:18:19
; -- test.iss --
; restools
; http://restools.hanzify.org
; TrayIconCtrl.dll 为一个用于Inno Setup的 11.5 KB 的 托盘图标插件.
; 这个托盘图标插件拥有目前 windows 系统托盘图标拥有的一切特性.
; 可以说你们看见过的,没看见过的托盘图标效果在这里都已经展现了出来
; 需要插件: InnoCallback.dll, 大小: 63.5KB 原插件地址: www.sherlocksoftware.org
; 这是我目前所做的最复杂的一个插件, 希望大家喜欢

; Ver 1.1 修正 BUG, 并作了一些小的调整。

[Setup]
AppName=MyApp
AppVerName=MyApp Ver 1.0
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
Compression=lzma
;WindowVisible=yes

[Files]
Source: trayiconctrl.dll; DestDir: {tmp}; Flags: dontcopy
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: "icon.ico"; Flags: dontcopy
Source: "icon1.ico"; Flags: dontcopy
Source: "icon2.ico"; Flags: dontcopy
Source: "icon3.ico"; Flags: dontcopy
Source: "icon4.ico"; Flags: dontcopy

[code]
type
// 如果你想传递更多的图标给插件,可以增加更多的 Icon 成员。
  
TIconList = record
   
Icon1: UINT;
    Icon2: UINT;
    Icon3: UINT;
    Icon4: UINT;
    // Icon5, Icon6 etc.
    // More...
  
end;
  
// 回调函数参数格式声明
  
TMenuItemClickProc = procedure(MenuIndex: Integer);
  TMenuPopupProc = procedure(PopMenu: LongWord; var bShow: Boolean);

// 使用回调函数的主要入口转换函数.
function WrapMenuItemClickProc(Callback: TMenuItemClickProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function WrapMenuPopupProc(Callback: TMenuPopupProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

function LoadImage(hInst: UINT; ImageName: String; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall';
function EnableMenuItem(hMenu: UINT; uIDEnableItem, uEnable: UINT): BOOL; external 'EnableMenuItem@user32.dll stdcall';
function IsWindowEnabled(hWnd: HWND): BOOL; external 'IsWindowEnabled@user32.dll stdcall';

// 初始化 TrayIcon 插件
function InitTrayIconCtrl(MainForm_Handle, WizardForm_Handle: THandle; uCallbackMessage: UINT;
     szToolTip: String; icon: UINT; bHidden: BOOL; ShowTaskbarAppBtn: BOOL; MenuItems: String;
     DefaultMnuIndex: Integer; MenuItemOnClickCallBack, MenuOnPopupCallBack: LongWord): Boolean;
     external 'inittrayiconctrl@files:trayiconctrl.dll stdcall';
// MainForm_Handle : MainForm.Handle
// WizardForm_Handle : WizardForm.Handle
// uCallbackMessage : 消息标志
// szToolTip : TrayIcon 的 ToolTip 提示, win9x: 64 字符限制, win2000 以上: 128 字符限制
// icon : 显示的 Icon 的句柄. 如果设为 0 的时候默认使用安装程序的图标
// bHidden : 是否立即显示 TrayIcon, 不需要由 ShowIcon 来显示
// ShowTaskbarAppBtn : 是否显示安装程序在任务栏中的按钮
// MenuItems : 所有菜单项的 Caption, 用 ";" 分隔, 如果要显示 ";" 用 "#3B" 代替, 设置为空字符串将会禁止菜单显示, 同时菜单回调函数也被忽略
// DefaultMnuIndex : 默认菜单项, 当默认菜单项不是 0 的时候, 双击 TrayIcon 的时候事件由用户设计
// MenuItemOnClickCallBack : TrayIcon 右键菜单点击事件控制
// MenuOnPopupCallBack : TrayIcon 右键菜单弹出前触发的回调事件

// 卸载 TrayIcon 插件
function UninitTrayIconCtrl(): Boolean; external 'uninittrayiconctrl@files:trayiconctrl.dll stdcall';

// 隐藏 托盘图标
function HideTrayIcon(): Boolean; external 'hidetrayicon@files:trayiconctrl.dll stdcall';

// 显示 托盘图标
function ShowTrayIcon(): Boolean; external 'showtrayicon@files:trayiconctrl.dll stdcall';

// 为显示动态图标而为插件添加一组 图标 列。
function SetIconList(pHIconList: TIconList; nNumIcons: UINT): Boolean; external 'seticonlist@files:trayiconctrl.dll stdcall';
// pHIconList : 图标组
// nNumIcons : 要添加多少个图标
     
// 显示动态图标动画
function AnimateTrayIcon(nDelayMilliSeconds: UINT; nNumSeconds: Integer): Boolean;
     external 'animatetrayicon@files:trayiconctrl.dll stdcall';
// nDelayMilliSeconds : 每个图标显示间隔时间, 这将影响动态速度
// nNumSeconds : 循环显示时间(秒数), 当这里设置为 -1 时, 将会无限时间循环

// 停止动态图标动画
function StopAnimation(): Boolean; external 'stopanimation@files:trayiconctrl.dll stdcall';

// 把 WizardForm 最小化到托盘图标, 或者还原出现
function ToggleWizardVisible(): Boolean; external 'togglewizardvisible@files:trayiconctrl.dll stdcall';

// 显示漫画型气泡提示, 这个函数只能对 Windows 2000 以上系统有作用
function ShowBalloon(szText, szTitle: String; dwIcon: DWORD; uTimeout: UINT; bWaitforPreMsg: Boolean): Boolean; external 'showballoon@files:trayiconctrl.dll stdcall';
// szText : 提示信息, 256 字符限制
// szTitle : 提示信息标题, 64 字符限制
// dwIcon : 提示信息中带有的图标
//    NIIF_NONE = 0x00000000;     无图标
//    NIIF_INFO = 0x00000001;     信息图标
//    NIIF_WARNING = 0x00000002;  警告图标
//    NIIF_ERROR = 0x00000003;    错误图标
// uTimeout : 停留的时间 范围: 10 ~ 30 秒. 如果无任何鼠标动作时, 系统自动维持 60 秒
// bWaitforPreMsg : 在 Win2000 中, 默认是要前一个消息消失后才会显示后一个消息, 这里设置为 False 的时候就直接替换前一个消息

// 隐藏漫画型气泡提示, 这个函数只能对 Windows 2000 以上系统有作用
function HideBalloon(): Boolean; external 'hideballoon@files:trayiconctrl.dll stdcall';

// WizardForm 是否已被最小化到系统托盘区
function WizardFormInTray(): Boolean; external 'wizardformintray@files:trayiconctrl.dll stdcall';

const
  
WM_USER = $400;
   WM_ICON_NOTIFY = WM_USER + 22; // 自己定义一个 TrayIcon 的消息标志以和其他的消息区分
  
IMAGE_ICON = 1;
  LR_LOADFROMFILE = $10;
  NIIF_NONE = 0;
  NIIF_INFO = $1;
  NIIF_WARNING = $2;
  NIIF_ERROR = $3;
  MF_BYPOSITION = $400;
  MF_ENABLED = 0;
  MF_GRAYED = 1;
var
  
AniIcon: TIconList;

procedure AnimateBtnOnClick(Sender: TObject);
begin
  
// 循环显示图标组 5 秒后自动停止
  
AnimateTrayIcon(40, 5);
  ShowBalloon('Animate Icon...', 'MyApp ver 1.0', NIIF_INFO, 10, False);
end;

procedure StopAnimateBtnOnClick(Sender: TObject);
begin
  
StopAnimation();
  ShowBalloon('Stop Animation...', 'MyApp ver 1.0', NIIF_WARNING, 10, False);
end;

// TrayIcon 菜单点击事件
procedure TrayMenuItemOnClick(MenuItemIndex: Integer);
begin
  
// 下面 这句代码表示 WizardForm 有弹出对话框时禁止菜单点击事件
  
if not IsWindowEnabled(WizardForm.Handle) then exit;
  
  Case MenuItemIndex of
  
0: ToggleWizardVisible; // 因为 0 项菜单为默认菜单, 所以这里的事件除了菜单点击外, 双击图标也能触发.
  
2: AnimateTrayIcon(40, 5);
  3: StopAnimation();
  5: MainForm.ShowAboutBox;
  7: WizardForm.Close;
  end;
end;

procedure TrayMenuOnPopup(PopMenu: LongWord; var bShow: Boolean);
begin
  
// 下面这一句的效果是如果 WizardForm 显示了对话框后,为了防止多重显示对话框,所以禁止了右键菜单
  
bShow := IsWindowEnabled(WizardForm.Handle);
  // 这里是菜单弹出前的处理回调函数, 以下的作用是当 WziardForm 缩到托盘区的时候, 禁用 "About" 和 "Exit" 的菜单
  
if WizardFormInTray() then
  begin
   
EnableMenuItem(PopMenu, 5, MF_BYPOSITION or MF_GRAYED);
    EnableMenuItem(PopMenu, 7, MF_BYPOSITION or MF_GRAYED);
  end else begin
   
EnableMenuItem(PopMenu, 5, MF_BYPOSITION or MF_ENABLED);
    EnableMenuItem(PopMenu, 7, MF_BYPOSITION or MF_ENABLED);
  end;
end;

procedure InitializeWizard();
var
  
AnimateBtn, StopAnimateBtn, CancelButton: TButton;
  Ico: UINT;
  MenuStrs: String;
  MenuItemClickCallback: LongWord;
  MenuPopupCallback: LongWord;
begin
  
ExtractTemporaryFile('icon.ico');
  ExtractTemporaryFile('icon1.ico');
  ExtractTemporaryFile('icon2.ico');
  ExtractTemporaryFile('icon3.ico');
  ExtractTemporaryFile('icon4.ico');

  MenuItemClickCallback := WrapMenuItemClickProc(@TrayMenuItemOnClick, 1);
  MenuPopupCallback := WrapMenuPopupProc(@TrayMenuOnPopup, 2);

  Ico := LoadImage(0, ExpandConstant('{tmp}\icon.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
  MenuStrs := '&Show/Hide WizardForm;' + // 0
              
'-;' +                     // 1
              
'&Animate Icon;' +         // 2
              
'S&top Animation;' +       // 3
              
'-;' +                     // 4
              
'&About...;' +             // 5
              
'-;' +                     // 6
              
'E&xit';                   // 7
  
InitTrayIconCtrl(MainForm.Handle, WizardForm.Handle, WM_ICON_NOTIFY, 'MyApp Ver 1.0', Ico,
       True, False, MenuStrs, 0, MenuItemClickCallback, MenuPopupCallback);

//  InitTrayIconCtrl(MainForm.Handle, WizardForm.Handle,
//       WM_ICON_NOTIFY,  // 自定义自己的消息 ID, 以区分其他消息
//       'MyApp Ver 1.0', // Tooltip 鼠标在 TrayIcon 图标上移动的时候显示的提示
//       0,               // 这里默认使用安装程序图标, 如果你使用 上面载入的 Ico, 你会看到你自己定义了一个图标显示
//       True,            // 立即显示, 不用调用 ShowTrayIcon
//       False,           // 不显示安装程序的任务栏按钮
//       MenuStrs,        // 所有菜单项文字字符串集合
//       0,               // 默认菜单项, 这里是第 0 项菜单加粗显示成为默认菜单, 并且双击图标事件由用户触发
//       MenuItemClickCallback, // 菜单点击事件回调函数
//       MenuPopupCallback // 菜单弹出时的回调函数
//       );

  // 显示漫画型气泡提示
  
ShowBalloon('Setup is starting...', 'MyApp ver 1.0', 0, 10, False);

  // 载入图标组
  
AniIcon.Icon1 := LoadImage(0, ExpandConstant('{tmp}\icon1.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
  AniIcon.Icon2 := LoadImage(0, ExpandConstant('{tmp}\icon2.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
  AniIcon.Icon3 := LoadImage(0, ExpandConstant('{tmp}\icon3.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
  AniIcon.Icon4 := LoadImage(0, ExpandConstant('{tmp}\icon4.ico'), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);

  // 传递图标组给插件
  
SetIconList(AniIcon, SizeOf(AniIcon) div SizeOf(AniIcon.Icon1));

  CancelButton := WizardForm.CancelButton;

  AnimateBtn := TButton.Create(WizardForm);
  AnimateBtn.Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width;
  AnimateBtn.Top := CancelButton.Top;
  AnimateBtn.Width := ScaleX(100);
  AnimateBtn.Height := CancelButton.Height;
  AnimateBtn.Caption := '&AnimateTrayIcon';
  AnimateBtn.OnClick := @AnimateBtnOnClick;
  AnimateBtn.Parent := WizardForm;

  StopAnimateBtn := TButton.Create(WizardForm);
  StopAnimateBtn.Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width + ScaleX(110);
  StopAnimateBtn.Top := CancelButton.Top;
  StopAnimateBtn.Width := ScaleX(100);
  StopAnimateBtn.Height := CancelButton.Height;
  StopAnimateBtn.Caption := '&StopAnimateIcon';
  StopAnimateBtn.OnClick := @StopAnimateBtnOnClick;
  StopAnimateBtn.Parent := WizardForm;
end;

procedure DeinitializeSetup();
begin
  
MainForm.Hide;
  WizardForm.Hide;
  UninitTrayIconCtrl();
end;



点击下面连接下载例子。
http://restools.hanzify.org/inno/trayiconctrl/IS_TrayIconCtrl_V1.1.zip

[ 本帖最后由 WLDNA 于 2008-11-4 10:29 PM 编辑 ]
附件: 您所在的用户组无法下载或查看附件
欢迎光临 我的百度空间

请将已得到答案的帖子改为 【已解决】 分类!!!

谢谢合作!

还真长啊

还是放弃看了
感谢Baidu,Google,Dreams8给我这次机会!
还要感谢我的爸爸妈妈!
HOHO
原帖由 似水年华 于 2008-11-2 10:11 PM 发表

还真长啊

还是放弃看了
呵呵 ,其实没有那么长的,里面有些是界面的代码,而且有些也不见得用不用那个呢,其实很短的,:-)
欢迎光临 我的百度空间

请将已得到答案的帖子改为 【已解决】 分类!!!

谢谢合作!
wldna版主,能不能把你最新做的雨林pe工具箱得脚本放出看看呢,我学习一下,谢谢了
返回列表