代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, shellapi, StdCtrls;const
  wm_MyCallback = wm_User+100;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    //向托盘添加图标
    Procedure AddTrayIcon;    procedure AppMessage(var Msg: TMsg; var Handled: Boolean);  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
const
  MsgStr='iconmsg';
                            
procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message =wm_MyCallback then
  begin
    showmessage('wm_MyCallback');
  end
  else
    inherited;
end;Procedure TForm1.AddTrayIcon;
//向任务栏添加图标
  Var IconData : TNotifyIconData;
Begin
  With IconData do Begin
    cbSize := SizeOf(IconData);
    Wnd := self.Handle;
    uID := 0;
    uFlags := nif_Icon Or nif_Message Or nif_Tip;
    uCallBackMessage := wm_MyCallback;
    hIcon := Application.Icon.Handle; //LoadIcon(hInstance,'MYICON');
    StrCopy(szTip,PChar('rola'));
  End;
  Shell_NotifyIcon(nim_Add,@IconData);
End;procedure TForm1.Button1Click(Sender: TObject);
begin
//  self.Hide;
  AddTrayIcon;
end;procedure TForm1.Button2Click(Sender: TObject);
//删除任务栏图标
  Var IconData : TNotifyIconData;
Begin
  With IconData do Begin
    cbSize := SizeOf(IconData);
    Wnd := self.Handle;
    uID := 0;
    uFlags := nif_Icon Or nif_Message Or nif_Tip;
    uCallBackMessage := wm_MyCallBack;
    hIcon := Application.Icon.Handle; //LoadIcon(hInstance,'MYICON');
    StrCopy(szTip,PChar('rola'));
  End;
  Shell_NotifyIcon(nim_delete,@IconData);
End;procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;end.请教:在AppMessage中为何接收不到消息wm_MyCallback

解决方案 »

  1.   

    你的自定义消息的处理函数在什么地方?在消息的处理中,你必须使用已经存在的消息来激发
    自定义的消息,比如说,你首先定义一个消息wm_callMessage;然后 编写一个消息的处理过程 procedure SelfMessage(var msg:Tmessage);message Wm_callMessage;中间如果鼠标双击消息发送了,就执行一部分代码。然后通过你的uCallBackMessage ,传送给你的AddTrayIcon过程,才能执行你的字定义的托盘消息部分
      

  2.   

    wxjh(将死之鱼) :
    procedure mymessageproc(var msg:Tmsg);message wm_MyCallback; procedure TForm1.mymessageproc(var msg:Tmsg);
    begin
      if msg.lParam = WM_LBUTTONDOWN then
      showmessage('mymessage');
    end;
    还是不行,但是把if条件去掉就会有message框,是不是 msg.lparam有问题啊
      

  3.   

    你的声明写错了,类型是Tmessage,不是tmsg!
      

  4.   

    http://asp2.6to23.com/youspcn/haoxg/ctrls.html看看他是乍写的,SysTray 2.4 系统托盘(也称通知区)组件