在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:

1
2
3
4
5
6
7
8
9
  _NOTIFYICONDATAA = record 
  cbSize: DWORD; 
  Wnd: HWND; 
  uID: UINT; 
  uFlags: UINT; 
  uCallbackMessage: UINT; 
  hIcon: HICON; 
  szTip: array [0..63] of AnsiChar; 
end; 

下面开始实现下最小化到系统托盘功能:
1.新建应用程序,然后在“菜单栏”→“Project”→“Options”→”Application“为程序设定下标题和图标,一定得设置图标,不让显示系统托盘的时候就会空白;
2.在窗体上放置一个右键菜单,添加两个菜单项,如下图所示:

3.窗体单元文件代码如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ShellAPI, Menus; 
 
const 
  WM_TRAYMSG = WM_USER + 101;                   //自定义托盘消息 
type 
  TForm1 = class(TForm) 
    pm1: TPopupMenu; 
    mniN1: TMenuItem; 
    mniwo1: TMenuItem; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure mniN1Click(Sender: TObject); 
  private 
    procedure WMTrayMsg(var Msg: TMessage);message WM_TRAYMSG;    //声明托盘消息 
    procedure WMSysCommand(var Msg: TMessage);message WM_SYSCOMMAND; 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
  NotifyIcon: TNotifyIconData;                    //定义托盘图标结构体 
implementation 
 
{$R *.dfm} 
{------------------------------------------------------------------------------- 
 Description: 窗体创建时,即创建托盘 
-------------------------------------------------------------------------------} 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  with NotifyIcon do 
  begin 
    cbSize := SizeOf(TNotifyIconData); 
    Wnd := Self.Handle; 
    uID := 1; 
    uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;   //图标、消息、提示信息 
    uCallbackMessage := WM_TRAYMSG; 
    hIcon := Application.Icon.Handle; 
    szTip := '托盘测试'; 
  end; 
  Shell_NotifyIcon(NIM_ADD,@NotifyIcon); 
end; 
{------------------------------------------------------------------------------- 
 Description: 窗体销毁时,卸载托盘 
-------------------------------------------------------------------------------} 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  Shell_NotifyIcon(NIM_DELETE,@NotifyIcon); 
end; 
{------------------------------------------------------------------------------- 
 Description: 截获窗体最小化消息,最小化到托盘 
-------------------------------------------------------------------------------} 
procedure TForm1.WMSysCommand(var Msg: TMessage); 
begin 
  if Msg.WParam = SC_ICON then 
    Self.Visible := False 
  else 
    DefWindowProc(Self.Handle,Msg.Msg,Msg.WParam,Msg.LParam); 
end; 
{------------------------------------------------------------------------------- 
 Description: 自定义的托盘消息 
-------------------------------------------------------------------------------} 
procedure TForm1.WMTrayMsg(var Msg: TMessage); 
var 
  p: TPoint; 
begin 
  case Msg.LParam of 
    WM_LBUTTONDOWN: Self.Visible := True;   //显示窗体 
    WM_RBUTTONDOWN: 
      begin 
        SetForegroundWindow(Self.Handle);   //把窗口提前 
        GetCursorPos(p); 
        pm1.Popup(p.X,p.Y); 
      end; 
  end;     
end; 
{------------------------------------------------------------------------------- 
 Description: 测试菜单项 
-------------------------------------------------------------------------------} 
procedure TForm1.mniN1Click(Sender: TObject); 
begin 
  ShowMessage('One'); 
end; 
 
end. 

4.运行结果如下:

参考MSDN(http://msdn.microsoft.com/en-us/library/bb773352(VS.85).aspx)对NOTIFYICONDATA结构体的介绍却是:

typedef struct _NOTIFYICONDATA {    
    DWORD cbSize;        //结构体的大小,以字节为单位    
    HWND hWnd;           //窗口的句柄    
    UINT uID;            //应用程序定义的任务栏图标的标识符    
    UINT uFlags;         //此成员表明具体哪些其他成员为合法数据    
    UINT uCallbackMessage;   //应用程序定义的消息标示    
    HICON hIcon;         //增加、修改或删除的图标的句柄    
    TCHAR szTip[64];     //指向一个以/0结束的字符串的指针    
    DWORD dwState;       //Version 5.0,图标的状态    
    DWORD dwStateMask;   //Version 5.0. 指明dwState成员的那些位可以被设置或者访问    
    TCHAR szInfo[256];   //指向一个以/0结束的字符串的指针,字符串的内容为气球提示内容    
    union {    
        UINT uTimeout;   //表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失    
        UINT uVersion;   //用来设置使用Windows 95 还是 Windows 2000风格的图标消息接口    
    };    
    TCHAR szInfoTitle[64];   //指向一个以/0结束的字符串的指针。字符串的内容为气球提示的标题    
    DWORD dwInfoFlags;   //设置此成员用来给气球提示框增加一个图标,增加的图标出现在气球提示标题的左侧    
    GUID guidItem;       //保留    
    HICON hBalloonIcon;  //用于Windows Vista或更高版本的自定义气球图标    
} NOTIFYICONDATA, *PNOTIFYICONDATA;   

那么为了在Windows XP下也有气泡提示,那么我们手动添加几个类型,大概代码如下:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  unit Unit1; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ShellAPI, Menus; 
//---------------------开始:Delphi 7下添加此声明------------------------------- 
const 
  NIF_INFO        = $00000010;          //气泡显示标志 
  NIIF_NONE       = $00000000;          //无图标 
  NIIF_INFO       = $00000001;          //信息图标 
  NIIF_WARNING    = $00000002;          //警告图标 
  NIIF_ERROR      = $00000003;          //错误图标 
  NIIF_USER       = $00000004;          //XP使用hIcon图标 
type 
  TNotifyIconDataEx = record 
    cbSize: DWORD; 
    Wnd: HWND; 
    uID: UINT; 
    uFlags: UINT; 
    uCallbackMessage: UINT; 
    hIcon: HICON; 
    szTip: array [0..127] of AnsiChar; 
    dwState: DWORD; 
    dwStateMask: DWORD; 
    szInfo: array [0..255] of AnsiChar; 
    case Integer of 
      0: ( 
        uTimeout: UINT); 
      1: (uVersion: UINT; 
        szInfoTitle: array [0..63] of AnsiChar; 
        dwInfoFlags: DWORD);  
  end; 
//---------------------开始:Delphi 7下添加此声明------------------------------- 
const 
  WM_TRAYMSG = WM_USER + 101;                   //自定义托盘消息 
type 
  TForm1 = class(TForm) 
    pm1: TPopupMenu; 
    mniN1: TMenuItem; 
    mniwo1: TMenuItem; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure mniN1Click(Sender: TObject); 
  private 
    procedure WMTrayMsg(var Msg: TMessage);message WM_TRAYMSG;    //声明托盘消息 
    procedure WMSysCommand(var Msg: TMessage);message WM_SYSCOMMAND; 
  public 
    { Public declarations } 
  end; 
 
var 
  Form1: TForm1; 
  NotifyIcon: TNotifyIconDataEx;                    //定义托盘图标结构体 
implementation 
 
{$R *.dfm} 
{------------------------------------------------------------------------------- 
 Description: 窗体创建时,即创建托盘 
-------------------------------------------------------------------------------} 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  with NotifyIcon do 
  begin 
    cbSize := SizeOf(TNotifyIconDataEx); 
    Wnd := Self.Handle; 
    uID := 1; 
    uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP + NIF_INFO;   //图标、消息、提示信息 
    uCallbackMessage := WM_TRAYMSG; 
    hIcon := Application.Icon.Handle; 
    szTip := '托盘测试'; 
    szInfo := '提示内容'; 
    szInfoTitle := '气泡标题'; 
    dwInfoFlags := NIIF_USER; 
  end; 
  Shell_NotifyIcon(NIM_ADD,@NotifyIcon); 
end; 
{------------------------------------------------------------------------------- 
 ……以下代码与上面例子一样 
-------------------------------------------------------------------------------} 

运行结果如下:

 

Delphi 7下最小化到系统托盘的更多相关文章

  1. Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)

    在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFY ...

  2. 将Mozilla ThunderBird最小化到系统托盘(转载)

    转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默 ...

  3. 将 VMware 最小化到系统托盘

    1, 下载 Trayconizer官网地址: http://www.whitsoftdev.com/trayconizer/下载地址: http://www.whitsoftdev.com/files ...

  4. C# WinForm窗口最小化到系统托盘

    * C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...

  5. WPF应用最小化至系统托盘运行

    原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...

  6. electron监听系统托盘,electron是否最小化到系统托盘

    在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...

  7. VC实现将对话框最小化到系统托盘

    1.minisysDlg.h头文件设置: 1)public: void setTray();//设置托盘    NOTIFYICONDATA nid;//NOTIFYICONDATA结构包含了系统用来 ...

  8. MFC程序最小化到系统托盘及其响应函数

    预备知识: Windows API函数: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid ...

  9. C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件

    1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小 ...

随机推荐

  1. jquery的ajax提交

    ajax函数封装 function Ajax(imethod,iurl,iasync,idata,ifunc){ $.ajax({ type:imethod, cache: false, dataTy ...

  2. 全局axios默认值 和 自定义实例默认值

    首先说了一下情况, 登录后成功返回token 然后在带着token去继续下面的请求, 奇怪的是都是当前页面起作用,刷新和跳转之后就token 就消失了. 查了 axios文档发现 被自己坑了 我设置了 ...

  3. Linux 下面adb命令的使用

    平板或者android手机使用adb是非常方便的.接下来我就介绍下adb使用以及一些常用的命令. 1,连接 用adb连接线,一端接PC的USB中,一端接平板或手机的adb口,当然得确保线没有问题,而且 ...

  4. (转)linux samb服务器配置

    1. 首先安装samba服务. 2. 配置防火墙(要先关闭) 3. 创建samba服务器用户:smbpasswd -a username     删除samba服务器用户:smbpasswd -x u ...

  5. Ubuntu Touch环境搭建

    最近搞了一下Nexus 5的MultiRom Manger,体验了一把Ubuntu Touch和Android L,总体感觉还不错,不过Android L的NFC驱动还有问题,Ubuntu Touch ...

  6. 解决:centos7.3 tomcat7启动巨慢问题

    目前公司大部分服务器操作系统还是centos6.5,tomcat用的是7,平时基本上没什么问题,启动也比较快,但是,最近有部分项目服务器更新至centos7.3 ,有些机器启动tomcat的时候巨慢无 ...

  7. niceScroll在ie11和edge浏览器上面滚动时抖动问题

    niceScroll 是一个很好的jquery插件,相信很多人都用过,我们项目中使用的是3.7.6版本的,一般我们在开发的时候都是使用的火狐或者是谷歌浏览器,使用 niceScroll 没有什么问题, ...

  8. centos7当中的systemd及systemctl(节选)

    全面进入centos7时代,这个东东是需要系统了解的. http://blog.jobbole.com/85070/?utm_source=blog.jobbole.com&utm_mediu ...

  9. 直接利用本地git上传项目到github

    http://m.blog.csdn.net/article/details?id=50441442 本文将详细介绍如何托管你的项目到github上   转载请标明出处: http://blog.cs ...

  10. Ubuntu下安装 Phantomjs

    1.安装phantomjs —-下载程序文件 wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x8 ...