Delphi自定义消息应用例子

现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail 3.0 NetVampire 3.0等都提供了这样的功能。

实现这样的功能实际上并不复杂,在窗口最小化时,窗口会发出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化时隐藏窗口并调用WindowsAPI函数Shell_NotifyIcon将定义的图标添加到任务栏上,Shell_NotifyIcon的函数定义是这样的:function Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall; 其中的参数dwMessage指定Shell_NotifyIcon函数的操作,可以是NIM_ADD NIM_DELETE NIM_MODIFY三个值中的一个,分别对应添加图标、删除图标、修改图标的动作。

参数lpData指向的PNotifyIconData结构的定义如下:

_NOTIFYICONDATAW = record
   cbSize: DWORD;
   Wnd: HWND;
   uID: UINT;
   uFlags: UINT;
   uCallbackMessage: UINT;
   hIcon: HICON;
   szTip: array [0..63] of WideChar;
  end;
  TNotifyIconData = _NOTIFYICONDATAW;

在这个结构中Wnd指明所属的窗口,UCallbackMessage指明回调消息,如果指明了Wnd和 uCallbackMessage,则当用户对任务栏图标有动作(如点击图标,在图标上移动光标等)。系统都会发送uCallbackMessage消息给Wnd指定的窗口。hIcon是要添加的图标的句柄,szTip 是图标的提示行(就是当移动光标到图标上,出现的一个小黄方框内出现的文字)。消息。实现上面的功能,最主要的是要处理WM_SYSCOMMAND消息和自定义的图标消息,这些消息在Delphi中并没有相应的事件。这里就需要使用到Delphi的自定义消息处理功能来截取并处理这些消息。

首先看下面的程序。在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。 

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, 
Classes, Graphics, Controls, Forms,
  Dialogs,ShellAPI;
const
  WM_BARICON=WM_USER+200;
type
  TForm1 = class(TForm)
  private
   procedure WMSysCommand(var
Message: TMessage); message WM_SYSCOMMAND;
   procedure WMBarIcon(var
Message:TMessage);message WM_BARICON;
   { Private declarations }
  public
   { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand
(var Message:TMessage);
var
  lpData:PNotifyIconData;
begin
  if Message.WParam = SC_ICON then
  begin
   //如果用户最小化窗口则将窗口
   隐藏并在任务栏上添加图标
   lpData := new(PNotifyIconDataA);
   lpData.cbSize := 88;
//SizeOf(PNotifyIconDataA);
   lpData.Wnd := Form1.Handle;
   lpData.hIcon := Form1.Icon.Handle;
   lpData.uCallbackMessage := WM_BARICON;
   lpData.uID :=0;
   lpData.szTip := 'Samples';
   lpData.uFlags := NIF_ICON 
or NIF_MESSAGE or NIF_TIP;
   Shell_NotifyIcon(NIM_ADD,lpData);
   dispose(lpData);
   Form1.Visible := False;
  end
  else
  begin
   //如果是其它的SystemCommand
   消息则调用系统缺省处理函数处理之。
   DefWindowProc(Form1.Handle,Message.
Msg,Message.WParam,Message.LParam);
  end;
//
end;
procedure TForm1.WMBarIcon(var Message:TMessage);
var
  lpData:PNotifyIconData;
begin
  if (Message.LParam = WM_LBUTTONDOWN) then
  begin
   //如果用户点击任务栏图标则将图标删除并回复窗口。
   lpData := new(PNotifyIconDataA);
   lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
   lpData.Wnd := Form1.Handle;
   lpData.hIcon := Form1.Icon.Handle;
   lpData.uCallbackMessage := WM_BARICON;
   lpData.uID :=0;
   lpData.szTip := 'Samples';
   lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
   Shell_NotifyIcon(NIM_DELETE,lpData);
   dispose(lpData);
   Form1.Visible := True;
  end;
end;
end.

时间: 2024-10-26 01:39:14

Delphi自定义消息应用例子的相关文章

求中国移动cmpp2.0的例子,最好是delphi的,谢谢啊

问题描述 求中国移动cmpp2.0的例子,最好是delphi的,谢谢啊我的qq391853298,电话13777421761,胡先生 解决方案 解决方案二:我有VC++代码,需要联系我

DELPHI 调用 Oracle 存储过程并返回数据集的例子.

oracle|存储过程|数据 环境: Win2000 + Oracle92 一.先在 Oracle 建包     CREATE OR REPLACE PACKAGE pkg_test     AS        TYPE myrctype IS REF CURSOR;        PROCEDURE get(i_test INTEGER,p_rc OUT myrctype);     END pkg_test;        CREATE OR REPLACE PACKAGE BODY pkg

Delphi FireDAC 下的 Sqlite(二) 第一个例子

为了方便测试, 我把官方提供的 C:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\data\FDDemo.sdb 复制了一份到 C:\Temp\FDDemo.sdb. {新建一个 VCL Forms Application, 然后添加如下控件(建议按 Ctrl + . 后用键盘输入添加):} TFDPhysSQLiteDriverLink // 用于驱动自动连接; 不同数据库各对应一个: TFDPhys****DriverLink

Delphi类的入门例子(9): 获取对象的 RTTI 属性与事件的函数

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, xmldom, XMLIntf, XMLBrokr, msxmldom, XMLDoc; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; Memo2:

Delphi类的入门例子(8): 遍历窗体中所有控件的函数

//显示窗体中所有控件的函数 function GetCtrls(Control: TWinControl; List: TStringList): Boolean; var i: Integer; obj: TWinControl; begin for i := 0 to Control.ControlCount-1 do begin obj := TWinControl(Control.Controls[i]); List.Add(obj.Name); //如果控件中包含其他控件, 则递归调

Delphi类的入门例子(7): 遍历窗体的所有父类

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender:

Delphi类的入门的例子(6): 类引用示例

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) RadioGroup1: TRadioGroup; procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shi

Delphi类的入门的例子(5): override

unit Unit1; interface uses Classes, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; TBase = class procedure proc1; virtual; procedure proc2; end; TChild = class(TBase) pro

Delphi类的入门例子(4): property

//类单元unit Person; interface type TPerson = class(TObject) private FName: string; FAge: Integer; public procedure SetName(const strName: string); procedure SetAge(const intAge: Integer); property Name: string read FName write SetName; property Age: In