最近有点烦: 又是关于NOTIFY ICON的事!(30分)

  • 主题发起人 主题发起人 茶叶蛋
  • 开始时间 开始时间

茶叶蛋

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟初学Delphi, 用NotifyIcon时,无论如何
点击Tray上的小图标(左点、右点、双点),
均无半点反映,根本不响应我的消息。
甚至Cut我们Delphi BBS上的源代码也没
用。还请大虾们指点。下面是原码。
( “....”是省略)

const
wm_notifyIcon = wm_user + 100;
type

NotifyIcon = record
....
uCallbackMessage: UINT;
end;

procedure pNotifyIcon( Var msg : TMessage );
Message wm_notifyIcon;

procedure TForm1.FormCreate(Sender: TObject);
nid.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
nid.uCallbackMessage := wm_notifyicon;
Shell_NotifyIcon( NIM_ADD, @nid );


procedure TForm1.pNotifyIcon( Var msg : TMessage );
...
case msg.LParam of
WM_LBUTTONDOWN:
...
 
>procedure TForm1.pNotifyIcon( Var msg : TMessage );
> ...
> case msg.LParam of
> WM_LBUTTONDOWN:

这个过程是不是在这里被调用的?
procedure TForm1.OnMessage(var Msg: TMessage); virtual;
begin
case Msg.Msg of
wm_notifyIcon:
pNotifyIcon(msg);

....
end;

 
原来的调用位置没错呀!这里是一个完整的例子:

unit Unit1;

interface

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

const
wm_notifyIcon = wm_user + 100;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure pNotifyIcon(var msg: TMessage); message wm_notifyIcon;
public
end;

var
Form1: TForm1;
nid: TNotifyIconData;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
nid.cbSize := sizeof (nid);
nid.Wnd := Handle;
nid.uID := 1;
nid.uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
nid.uCallbackMessage := wm_notifyicon;
nid.hIcon := Application.Icon.Handle;
lstrcpy (nid.szTip,' TrayIcon Examples');
Shell_NotifyIcon (nim_Add, @nid);
end;


procedure TForm1.pNotifyIcon( Var msg : TMessage );
begin
case msg.LParam of
WM_LBUTTONDOWN:
Application.MessageBox('aaa','bbb',0);
end;
end;

end.
 
Hehe, who and where and why should windows call the TForm1.pNotifyIcon?
I can't see, please tell me. :)
 
That is right. We have delphi component. Who needs NotifyIcon?
 
Delphi不是C++,处理自定义消息时,只要定义一下就行了!
请看这两处:
procedure pNotifyIcon(var msg: TMessage); message wm_notifyIcon;

nid.uCallbackMessage := wm_notifyicon;

我猜茶叶蛋是想作练习吧! ^_^
 
Right TrayIcon is enough!
Rxlib's trayicon has problem. it cannot disable itself!
 
谢谢littlegrass,你的那个程序我
这里有几乎一模一样的(我的程序
没用起来后我疯狂地到处Cut程序)。

谢谢huizhang,我深刻地体会到
有控件的好处,如果不冲着控件众
多的话,我不会放弃顺手了两年的
VC,一个月前改学Delphi。但我始
终觉得很多事并不只能靠控件解决。
(例如一旦要编比它更好的控件)

Hi,Pegasus,你的方法我还没用,
(现在还没轮到机器给我用),但是
我在程序中用我所用的方法成功地响
应了WM_COMMAND等多条消息。而
WM_NOTIFYICON这条消息无论如何
就是无动于衷。而且我想,WINDOWS
里的消息在DELPHI中的响应应该是一
样的,无论是不是自己定义的。所以
我想找出毛病所在。
我也试用了AFXREGISTMESSAGE
(好象是这个函数,我伤亡和编程不在
一台机器上,所以暂时无法确定名字),
但是也没用。有那位大虾清楚它的用法,
还望告诉我一声。

其实有时只是对DELPHI的编程细节不清
楚,像这条NOTIFYICON,在VC中不知
用了多少次,但是牵涉到DELPHI中的消
息响应,就一筹莫展了。
 
茶叶蛋,我这个程序是可以响应wm_notifyIcon消息的呀?!
你试了没有,和你的程序有何不同?
 
呵呵, 我知道了一处可能的错误,
茶叶蛋, 您自己定义了一个结构
NotifyIcon = record
....
uCallbackMessage: UINT;
end

, 我不敢保证它同系统定义的相同,
Dephi对于;
Shell_NotifyIcon( NIM_ADD, @nid );
的调用并没有检查nid的类型是否同系统定义的一致,
所以问题可能出在这里, 我试过了您的例子,
完全没有问题, 但是我把@nid换成其他的某个类型,
就出问题啦!

但愿如此!!
 
大家好,我是倒霉的茶叶蛋!

pegasus老兄,首先看到你的后面这段话,
我应用了ShellAPI中的TNotifyIconData声明我的nid,好像是没用,
我在pNotifyIcon函数的开头设置了断点,但是点Tray上的Icon时没反映。
下面是我找到的声明:
_NOTIFYICONDATAA = record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array [0..63] of AnsiChar;
end;
TNotifyIconDataA = _NOTIFYICONDATAA;
TNotifyIconData = TNotifyIconDataA;

然后我又用了你的TForm1.OnMessage函数,编译时系统告诉我"Virtual"
有错,我去掉它以后,开始运行。我把断点设到了OnMessage的第一句话,
但是好像他并不响应一条消息,是不是"Virtual"的问题?

PS:鉴于本人至今仍未编出这个程序,希望诸位大虾寄一个程序给我,不要
控件(茶叶蛋至今仍未学会编控件,而且发誓在自己编出第一个向样的控件
以前不用Delphi本身以外的控件),最好给我一个FTP地址下载!

我想要一个Exe程序和一些源代码,给我程序的大虾酬谢五个茶叶蛋!

pegasus,我们在一个城市,要不要回华工重温茶叶蛋呢?
 
源代码已寄出!

华工?是华中理工大学?
 
>pegasus,我们在一个城市,要不要回华工重温茶叶蛋呢?
呵呵, 是华东工学院, 现在叫做南京理工大学.
茶叶蛋: 我用的就是littlegrass贴在上面的例子, 没有问题呀!
要不然, 还是把您的程序寄给我, 我帮您看看?
 
忘了一个程序,请在此下载:<a href="http://personal.wol.com.cn/grass/TrayExam.zip">TrayExam.zip</a>
 
茶叶蛋,你好!
我用Delphi写了个TrayIcon的范例程序(已E-mail给你)
,也许对你有所帮助。以上大家写的程序包括我写的
此范例都明显的带有C++的编程习惯,虽然能用但不
一定是最适合用Delphi编写,如有兴趣可到我的主页
(http://www.lxspace.net/~rockboy)下载区中下载
我以前用Delphi写的程序ActivePaper,也许对你学
习Delphi有所帮助。
 
啊呀,真是对不起大家,我在DelphiBBS的Email地址昨天换了
一下,今天去收件,居然一封信也没有,只好厚着脸皮请大虾
们再寄一次了。
我马上去你们的主页下载。
 
HI, rockboy,我在今天11:45分去你的(202.99.104.115),返回
一个错误信息:“无法打开”
 
littlegrass,你的ZIP文件我脱了一上午还没脱下来,
明天再拖。
 
茶叶蛋:
我的主页http://www.lxspace.net/~rockboy 所在的服务器出了些问题,估计今天或明天便可正常,欢迎有空来逛逛!我先把ActivePaper.Zip及TrayDemo.Zip E-mail给你。
 
呵呵, 搞定啦!
茶叶蛋:
请您把这一行:
nid.Wnd := Application.Handle;
改成:
nid.Wnd := Handle;

您让Windows系统把消息发送给Application啦! 但是您的
pNotifyIcon是Form上的, 所以应该把Form自己的Handle传给
Shell_NotifyIcon(...);

另外:
您寄程序给我时用的是匿名地址, 我不能回信!
 
后退
顶部