最小化到托盘

这个办法主要是针对Delphi2010或者更高版本, 利用自带的TTrayIcon来实现最小化到托盘的功能, 至于低版本, 比如D7, 使用RZ的Tray控件就好了



主要修改点:

  1.2010或者更高版本, 自带了一个TTrayIcon控件来实现托盘图标, 但是这个控件没有实现最小化时隐藏的功能

  2.2010或者更高版本增加了MainFormOnTaskbar功能, 众所周知, delphi的任务栏按钮一直都不是标准的windows风格, 有了这个设置后, 任务栏按钮正常了, 但是也为我们的这个功能的实现增加了一些障碍

注意: 由于有MainFormOnTaskbar的区别, 所以要看当前状态是需要隐藏主窗体还是隐藏Application

  另外, 在MainFormOnTaskbar模式下, Application.Restore无法触发OnRestore事件, 所以只能用代码去执行了

以下为窗体元素:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = ‘Form1‘
  ClientHeight = 243
  ClientWidth = 472
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = ‘Tahoma‘
  Font.Style = []
  OldCreateOrder = False
  OnCloseQuery = FormCloseQuery
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object ApplicationEvents1: TApplicationEvents
    OnMinimize = ApplicationEvents1Minimize
    OnRestore = ApplicationEvents1Restore
    Left = 128
    Top = 96
  end
  object TrayIcon1: TTrayIcon
    PopupMenu = PopupMenu1
    Visible = True
    OnDblClick = actActionExecute
    Left = 176
    Top = 96
  end
  object ActionList1: TActionList
    Left = 128
    Top = 144
    object actAction: TAction
      Caption = ‘actAction‘
      OnExecute = actActionExecute
    end
  end
  object PopupMenu1: TPopupMenu
    Left = 176
    Top = 144
    object miVisible: TMenuItem
      Action = actAction
    end
    object N1: TMenuItem
      Caption = ‘-‘
    end
    object miClose: TMenuItem
      Caption = #20851#38381
      OnClick = miCloseClick
    end
  end
end

以下为实现代码, 注意事项写到注释里了

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Actions, Vcl.ActnList, Vcl.Menus, Vcl.ExtCtrls,
  Vcl.AppEvnts;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    TrayIcon1: TTrayIcon;
    ActionList1: TActionList;
    PopupMenu1: TPopupMenu;
    miVisible: TMenuItem;
    N1: TMenuItem;
    miClose: TMenuItem;
    actAction: TAction;
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure actActionExecute(Sender: TObject);
    procedure miCloseClick(Sender: TObject);
    procedure ApplicationEvents1Restore(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FAppClose: Boolean; {程序是否关闭}
    FAppMinimized: Boolean; {程序是否最小化}
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.actActionExecute(Sender: TObject);
begin
  if FAppMinimized then
  begin
    {在MainFormOnTaskBar模式下, 不能直接执行Application.Restore,
    无法触发OnRestore事件, 需要手动触发, 个人感觉是delphi的BUG, 没有深入研究}
    if Application.MainFormOnTaskBar then
      ApplicationEvents1.OnRestore(ApplicationEvents1)
    else
      Application.Restore;
  end
  else
    Application.Minimize;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
var
  nDoHandle: HWND;
begin
  FAppMinimized := True;
  actAction.Caption := ‘显示‘;
  {要做到在任务栏上隐藏, 需要吧任务栏按钮的对应窗体隐藏掉}
  if Application.MainFormOnTaskBar then
    nDoHandle := Application.MainForm.Handle
  else
    nDoHandle := Application.Handle;
  ShowWindow(nDoHandle, SW_HIDE)
end;

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
var
  nDoHandle: HWND;
begin
  FAppMinimized := False;
  actAction.Caption := ‘隐藏‘;
  {恢复显示, 吧任务栏对应窗体显示,
  考虑到MainForm窗口有普通和最大化的模式区别, 所以使用SW_RESTORE来恢复显示
  显示后激活并置前窗体}
  if Application.MainFormOnTaskBar then
    nDoHandle := Application.MainForm.Handle
  else
    nDoHandle := Application.Handle;

  ShowWindow(nDoHandle, SW_RESTORE);
  SetForegroundWindow(nDoHandle);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

  function _CanClose: Boolean;
  var
    nStr: string;
  begin
    nStr := ‘确定要关闭‘ + Application.Title +‘?‘;
    Result := MessageBox(Handle, PChar(nStr), PChar(Application.Title), MB_ICONQUESTION + MB_YESNO) = IDYES;
  end;

begin
  {设置了点击窗体关闭按钮时也是最小化到托盘的功能, 所以需要一个FAppClose变量来区别是最小化还是关闭}
  if FAppClose then
  begin
    CanClose := _CanClose;
    if not CanClose then
      FAppClose := False;
  end
  else
  begin
    Application.Minimize;
    CanClose := False;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FAppClose := False;
  FAppMinimized := False;
end;

procedure TForm1.miCloseClick(Sender: TObject);
begin
  FAppClose := True;
  Close;
end;

end.
时间: 2024-10-09 21:51:51

最小化到托盘的相关文章

WPF实现窗口最小化到托盘,并且实现右击菜单

原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System.Drawing;using Forms = System.Windows.Forms; 2.XAML的后代相应事件的Demo,只是为了看起来方便~!其中也包含了在任务栏中不现实图标,只在托盘中显示.双击实现窗口的还原.没用到大神写的,自己琢磨了个,令人想不到的蛋疼的后果还没出现,也就暂时这样了. 1

Outlook2007最小化至托盘

设置outlook新邮件到达提醒:Tool->Options->Prefrences->Email->Email Options->Advanced Email Options->When new items arrive in my Inbox这里面几项你根据需要设置一下就可以了. OUTLOOK启动后最小化总是在任务栏上占一个位置,工作起来碍事,所以希望它能够最小化到托盘,以下方法可以帮你实现: 打开注册表 : 开始菜单 -> 运行, 输入"rege

WinForm 之 窗口最小化到托盘及右键图标显示菜单

Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. 一.添加NotifyIcon控件 1 如下图为窗体添加一个 NotifyIcon 控件,并指定 Icon 和 Text 属性,如下图: 2 在需要窗体最小化到托盘的处理代码中,添加如下代码: if(this.WindowState==FormWindowState.Normal&&this.V

vb最小化到托盘

'-----------------------窗体中-------------------------- Dim WindowTop, WindowLeft Function WindowStyle() '以下把程序放入System Tray====================================System Tray Begin With nfIconData .hWnd = Me.hWnd .uID = Me.Icon .uFlags = NIF_ICON Or NIF_M

winform最小化到托盘,托盘右击菜单显示

添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加): 主要的代码: public partial class Form1 : Form { #region //创建NotifyIcon对象 NotifyIcon notifyicon = new NotifyIcon(); //创建托盘图标对象 Icon ico = new Icon("u9.ico"); //创建托盘菜单对象 ContextMenu notifyContextMenu =

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总

托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总 转自:http://midasyang.blog.163.com/blog/static/189744104201141245344681/ 启动不显示主窗体如果通过Form1.Visible:=False;语句来实现的话,会出现主窗体一闪而过的情形.更好的办法是在OnShow事件中添加Application.ShowMainForm := False; 程序不出现在任务栏procedure TForm1.FormShow(S

VC实现窗口最小化至托盘

所谓的"托盘",在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分.在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区. 一 .原理 1.最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标. 2.恢复的原理:将窗口显示,再将托盘中的图片删除. 二.代码实现 1.自定义消息WM_SHOWTASK: 为了防止用户定义的消息ID与系统的消息ID冲突,MS定义了一个宏WM_USER,小于WM_USER的ID被系统使用,大于 WM_USE

将VMware工作站最小化到托盘栏

目录 前言 将VMware最小化到托盘栏的方法 1.下载 Trayconizer 2.解压 trayconizerw.zip 3.创建 VMware 快捷方式 4.修改 VMware 快捷方式 5.运行 前言 因为一直要用到虚拟机,每次最小化的时候,总是占用任务栏,很不爽,于是在网上搜索了一番,终于找到一个可以用的方法. 将VMware最小化到托盘栏的方法 首先下载一个软件,叫做Trayconizer,最好把这个文件放在固定的目录下,比如我放在了D盘下的ProgramFiles目录下. 1.下载

Delphi - 利用TRzTrayIcon实现WinFrm工程最小化到托盘

第三方RC控件的安装 浏览器搜索Delphi Rz控件下载,找到下载一个安装文件,解压后点击RC3.exe一键安装. Delphi WinFrm工程最小化到托盘 Delphi新建WinFrm工程,在主窗体上添加TRzTrayIcon.TImageList和TPopupMenu.此时运行工程,点击最小化即可实现到托盘的效果. 系统最小化时实现提示信息 选中RzTrayIcon,单击F11,选择Events,双击OnMinimizeApp,写如下代码: procedure TForm1.RzTray