想做托盘程序用哪一个API?

wzwcn 2003-11-22 08:12:41
请帮我详细的讲每一个参数。谢了!
...全文
40 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyf 2003-11-28
  • 打赏
  • 举报
回复
Shell_NotifyIcon
nim_add
nim_delete
Tnotifyicondata
Msdn里有详细的介绍
yudehui 2003-11-28
  • 打赏
  • 举报
回复
SHELLAPI.pas
fengzheng 2003-11-27
  • 打赏
  • 举报
回复
晕。来晚了!
还是说说:
(1)用到shell_notifyicona()函数
(2)在private中定义my_message
和一个过程oniconnotify
OK!!!!
pwzhu666 2003-11-27
  • 打赏
  • 举报
回复
上面有人说了啊,我也是刚刚才学会的
angelface 2003-11-26
  • 打赏
  • 举报
回复
看来接分就可以了, 呵呵,
hongqi162 2003-11-26
  • 打赏
  • 举报
回复
up
yudehui 2003-11-26
  • 打赏
  • 举报
回复
shellapi
MartinWang 2003-11-25
  • 打赏
  • 举报
回复
这种问题还是先搜一下吧:)
xiaoshiyun 2003-11-25
  • 打赏
  • 举报
回复
谢了,小弟也正在找此类例子
jxc163 2003-11-24
  • 打赏
  • 举报
回复
网上有很多的例子。
jbzj 2003-11-24
  • 打赏
  • 举报
回复
关注,收藏!
54993699 2003-11-23
  • 打赏
  • 举报
回复
在把我自己做过的例子帖给你吧

unit Unit1;

interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, StdCtrls, Menus;
const
WM_NID=WM_USER+1000; //定义一个消息常量 ,
//系统规定从WM_USER开始为用户自定义消息

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
Label1: TLabel;
procedure FormDestroy(Sender: TObject);
procedure installicon;
procedure N1Click(Sender: TObject);
procedure FormShow(Sender: TObject);

private
procedure IconOnClick(var message:TMessage); message WM_NID;
//自定义mouse的click事件
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
//截获 WM_SYSCOMMAND消息,看窗体是否处于最小化状态
public

end;

var
Form1: TForm1;
NotifyIcon:TNotifyIconData;//NotifyIcon是非常重要的一个变量,
//整个程序基本上是围着这个变量在转。
//TNotifyIconData是一个记录类型

implementation

{$R *.dfm}
procedure TForm1.WMSysCommand(var Message:TMessage);
begin
if Message.WParam = SC_ICON then //最小化了
begin
form1.hide;
installicon;
end
else
inherited;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon); //从任务栏删除图标
end;


procedure TForm1.installicon;
begin
application.ShowMainForm:=false;
//SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
//上面的函数可以和application一样用。但是只隐藏任务栏
//NotifyIcon为全局变量,在程序的开头已经定义了
with NotifyIcon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=1;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=WM_NID;
hIcon:=Application.Icon.Handle;
szTip:='任务栏演示程序';
end;
//把设置好的变量NotifyIcon加入到系统中以便处理
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
end;


procedure TForm1.IconOnClick(var message:TMessage);
//处理鼠标在指示状态栏对应的图标上的单击事件
var
p:TPoint;
begin
//如果按下的是鼠标左键,并且允许显示,则显示Form2
if message.lParam=WM_LBUTTONDOWN then
Form1.Show;
//如果按下的是鼠标右键,则显示弹出菜单
if(message.lParam=WM_RBUTTONDOWN)then
begin

GetCursorPos(p);
PopupMenu1.Popup(p.x,p.y);
end;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
form1.Show;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
showwindow(application.Handle,SW_SHOWNA);
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
end;

end.
54993699 2003-11-23
  • 打赏
  • 举报
回复
帖一个已前看到的帖子吧,能回答你全部的问题。给分吧


{uses中加入 shellapi
File->New Applicaton 在Interface部分定义一个消息常量:const WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。
定义一个全局变量: NotifyIcon:TNotifyIconData,NotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:
  TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconData和TNotifyIconDataA是同种数据类型,接着往下看有:
TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看:
type
_NOTIFYICONDATAA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end;
  这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。
  1> cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。
  2> Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。
  例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。
  3> uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。
  4> uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:
   NIF_ICON 表示当前所设置的图标(即hIcon的值)是有效的
 NIF_MESSAGE 表示当前所设置的系统消息(即uCallBackMessage的值)是有效的
  NIF_TIP 表示当前所设置的提示条(即szTip的值)是有效的。
 5> uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。
 6> hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。
7> szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。}
hottey 2003-11-22
  • 打赏
  • 举报
回复
楼上说的对,
给你发个例程:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,shellapi, Menus;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N111111111: TMenuItem;
N222221: TMenuItem;
N33331: TMenuItem;
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure wmsyscommand(var msg:Tmessage);message wm_syscommand;
public
{ Public declarations }
procedure instell;
procedure WndProc(var Msg: TMessage); override;
end;

const msg_tray=wm_user+1105;
var
Form1: TForm1;
myicon: NotifyIconData;

implementation

{$R *.dfm}
procedure Tform1.instell;
begin
with myicon do
begin
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; //指向当前窗体Form1的句柄
uID:=0;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
ucallBackMessage:=msg_tray;
hIcon:=Application.Icon.Handle;
szTip:='哈哈哈哈';
end;
Shell_NotifyIcon(NIM_ADD,@myicon);
end;

procedure Tform1.wmsyscommand(var msg:Tmessage);
begin
case msg.WParam of
sc_minimize : begin //最小化
Application.Minimize;
form1.Hide;
instell;
inherited;
end;
else
inherited;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @myicon);
end;

procedure TForm1.WndProc(var Msg: TMessage);
var
pt:TPoint;
begin
with Msg do
begin
if Msg = msg_tray then
begin
case lParam of
WM_RBUTTONDOWN: begin
GetCursorPos(pt);
PopupMenu1.Popup(Pt.X, Pt.Y);
end;
WM_LBUTTONDOWN: begin
form1.Visible:=not form1.Visible;
Shell_NotifyIcon(NIM_DELETE, @myicon);
end;

end;
end;
end;
inherited;
end;

end.
fengyvn 2003-11-22
  • 打赏
  • 举报
回复
SHELLAPI.pas中的函数
Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL;
dwMessage为要执行的操作,可取0:图标加到托盘,1:修改图标属性,2:移除图标.
参2为一记录,可定义图标相关信息.

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧