惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Archives - TechRepublic
MongoDB | Blog
MongoDB | Blog
量子位
博客园 - 叶小钗
罗磊的独立博客
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
MyScale Blog
MyScale Blog
GbyAI
GbyAI
Help Net Security
Help Net Security
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
Hacker News - Newest:
Hacker News - Newest: "LLM"
Latest news
Latest news
H
Hacker News: Front Page
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
S
Schneier on Security
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
S
Securelist
博客园 - Franky
Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
About on SuperTechFans
N
News and Events Feed by Topic
AI
AI
T
Tenable Blog
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX - 技术
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
L
LINUX DO - 热门话题
N
Netflix TechBlog - Medium
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
S
Security Affairs
Webroot Blog
Webroot Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 三生石上(FineUI控件)
C
Comments on: Blog
G
GRAHAM CLULEY

博客园 - 左左右右

连接 password ttreeview 一些汇编指令 Delphi与汇编 TObject.Dispatch TApplication与主消息循环 核心库类之TGraphicControl/TcustomControl 与画布(Canvas) 核心库类之TControl 核心库类之TObject 内存管理 触发器 模式窗体和非模式窗体 在dll中delphi中封装窗体(实例) MessageDlg dll 杂题 Delphi异常 Delphi与C++的语法区别
消息自定义
左左右右 · 2007-04-25 · via 博客园 - 左左右右

P>现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象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    rm1.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.
  运行上面的程序,点击程序窗口标题栏上的最小化按钮,你就可以看到窗口被“最小化”成了一个任务栏图标,点击图标,窗口又会恢复原来的状态。

  从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下:

procedure UserPro(Var Message:
TMessage):message WindowsMessage
其中UserPro是用户自定义消息处理函数的名称,
WindowsMessage是Windows消息常量或自定义消息常量。
  然后在程序中加入消息处理函数,函数的一般格式如下:

 Procedure UserClass.UserPro(Var Message:TMessage);
 var
 //加入定义
 Begin
 //加入程序语句
 End;
 其中UserClass是封装自定义消息处理函数的类的名称。
  最后,Delphi的自定义消息处理函数要涉及到Windows的消息的结构,在这里我就不多说了,大家可以参考Windows API帮助和Delphi的相关帮助信息。相信大家如果掌握了Delphi的自定义消息处理函数,一定可以编写出象VB一样简洁,象C++一样功能强大的程序来的。