呵呵,不行,我测试过的!
 insertmenu(getsystemmenu(handle,false),0,MF_BYPOSITION+MF_STRING,0,'test');
sysmenu跟任务栏的菜单不一样!

解决方案 »

  1.   

    呵呵,Application本身也是一个窗口(就是哪个按钮呀)。如下就不一样了。
    InsertMenu(GetSystemMenu(Application.Handle, False), 0, MF_BYPOSITION + MF_STRING, 0, 'test');
      

  2.   

    不过还是截获不了Mouse事件。:(
      

  3.   

    消息是一样的。不过Application对按钮上的一些默认的处理的过滤了,其它的消息才传入下层。只有用钩子勾住WndProc才能截获Application中的这些消息。或者干脆自己修改VCL源码?!^_^
      

  4.   

    2 goodhope:
    10'。
    OK,明白你的意思!但是鼠标在任务栏的消息是什么?重载wndproc之后应该处理那个消息?!例如左键单击?以后一起给分!
      

  5.   

    也是WM_NC系列。我在调试器里面看到了当在任务栏上点击鼠标的时候有WM_NC消息出现,但是在Application.OnMessage里面却收不到,应该是VCL处理掉了。但是TApplication的WindowProc属性又被保护了,无法替换。估计要用钩子勾住WndProc才行了。我试试看。
      

  6.   

    修改WndProc还是没拦住,即使我把程序暂停了,菜单也能弹出来。也许是因为我用的是2K,这个菜单是受系统控制的。以便程序实效的时候,能够通过这个菜单关闭应用。其中Close是一直有效的。而其它的菜单项是根据应用的状态决定的(窗口大小,程序是否有响应)。不知Win9x下是否也这样。
      

  7.   

    我误会你的意思了。要响应这个任务栏按钮上菜单,需要在Application的OnMessage中处理。Delphi5中可以利用TApplicationEvents构件。procedure TfmPilot2000Main.aeAppMessage(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if    (Msg.Message = WM_SYSCOMMAND)
        and (WParam = MF_BYPOSITION + MF_STRING)
        and (hWnd = Application.Handle) then
      begin
        // TODO: Add your message handler code here and/or call default
      
        Handled := True;
      end;
    end;
      

  8.   

    对啊,我就是在OnMessage中进行处理的,但是不知道这个消息是什么!我其实要问的就是这个消息的值!WM_NC?????
      

  9.   

    还是下面这些消息,不过根本收不到任务栏上的。但是的确产生了,在Event Log窗口中能够看到。WM_NCHITTEST
    WM_NCLBUTTONDBLCLK
    WM_NCLBUTTONDOWN
    WM_NCLBUTTONUP
    WM_NCMBUTTONDBLCLK
    WM_NCMBUTTONDOWN
    WM_NCMBUTTONUP
    WM_NCMOUSEMOVE
    WM_NCRBUTTONDBLCLK
    WM_NCRBUTTONDOWN
    WM_NCRBUTTONUP
      

  10.   

    呵呵,我以前用Spy++也察看过,但是不得其要领,最终没有找到那个消息,所以只好请教在座的各位高手了。拜托!
      

  11.   

    其实这两天我也在找这个消息号,看破眼皮也找不到啊
    Application是一个全局变量,有的消息是不会发给主窗体FORM的,如果想处理的话,需要一个写一个方法,然后将application的onmessage指向这个方法指针就可以了。
    比如
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        procedure FilterMessage(var Msg: TMsg; var Handled: Boolean);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FilterMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      If (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = SC_MINIMIZE) then
      begin
        ShowMessage('SC_MINIMIZE');
        Handled := true;
      end
      else
        inherited;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := FILTERMessage;
    end;end.
      

  12.   

    不会吧?如果是那样的话,请看一下Delphi生成的程序在任务栏的菜单和IE的任务栏的菜单!两个不一样!
      

  13.   

    不过我在应用消息中发现的大量下面4个消息WM_NCCREATE
    WM_NCCLACSIZE
    WM_NCACTIVE
    WM_NCDESTROY
      

  14.   

    只有Boland的工具写的好像都这样:(比如FoxMail。看来可以根据这个来判断一个程序是不是用Borland的工具写的。
      

  15.   

    原来这个问题这么难啊?!
    2 goodhope:
     OICQ是用Borland的工具写的吗?
      

  16.   

    那么怎样在Delphi生成的程序在任务栏的菜单中加入菜单?
      

  17.   

    原来不难
    在TApplication.CreateHandle中有如下代码:
      SysMenu := GetSystemMenu(FHandle, False);
      DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
      DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
      if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);
    去掉就可以了
      

  18.   

    不过修改后的Form单元怎么一编译,Delphi就没死掉了。
      

  19.   

    原来是我Delphi装的构件太多,找个干净的Delphi就可以了。  选择菜单Project->Options。在Packages页中关闭Build with runtime packages 选项(即不选中); 并在Dicectorise/Conditionals页中Search path中添加一项[$DELPHI]\Source\VCL。
      
      将DelphiX\Lib目录下的Forms.dcu改名为OriginForms.dcu。  打开DelphiX\Source\VCL目录下的Forms.pas屏蔽掉TApplication.CreateHandle中如下代码:
      SysMenu := GetSystemMenu(FHandle, False);
      DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
      DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
      if NewStyleControls then DeleteMenu(SysMenu, SC_MOVE, MF_BYCOMMAND);  选择菜单Project->Build 你的工程即可(请先保存工程,因为有时Build后会兰屏,主要是因为装了一些构件。重运行Delphi即可)。   最后,选择菜单Project->Options。去掉刚才在Dicectorise/Conditionals页中Search path中添加的[$DELPHI]\Source\VCL这一项。
      将DelphiX\Source\VCL目录下的Forms.dcu 复制到DelphiX\Lib目录。再删除DelphiX\Source\VCL目录下其它无用了的*.dcu文件。
      

  20.   

    这个消息是用户自定义的消息;
    用SPY拦时,查看WM_USER+0x???.
      

  21.   

    唉,现在只是看得见了。不过没效果:(。还得改。是不是Delphi为了和其它平台兼容给去掉了。
      

  22.   

    呵呵,辛苦GoodHope了。不过跟我要的答案还是有一段的距离。
    2 mjian:
      不会吧?你说的是系统栏内的图标吧?
      

  23.   

    在Application中的WndProc中没有对这3个消息(SC_SIZE、SC_MOVE、SI_MAXIMIZE)的处理。而且,Application也只有Minimize和Restore这两个功能函数。我想这是由于Delphi的普通应用的风格决定的。一般其它窗口不包含在主窗口之中(即使是MDI程序,非子窗口也是这样),因此,对于应用的最大、移动的操作在逻辑上存在矛盾,所以Borland将这3个应用上的菜单项删除了。
      

  24.   

    加分了!提高分数,刺激大家的热情!!!
    我还要等一等,还有谁要说什么吗?
    2 goodhope:
     以后一起给分!
      

  25.   

    如果是你自己用delphi编的程序,在主窗口的OnMouseDown事件中可以拦截,可参看delphi大本营中关于任务栏程序的文章。
    如果是别人的程序,你只好用Hook技术来实现了,VC5中有Hook的例子,把它移植到delphi下即可拦截你想要捕获的鼠标消息。
      

  26.   

    在MouseDown中不行!只要能够拦截自己写的程序的消息即可!
      

  27.   

    建议Kingron找到delphi大本营中关于怎样写任务栏程序的文章,当把主窗口隐藏后,任务栏上的图标就代表应用程序,主窗口的OnMouseDown事件能用来处理鼠标左键和右键要做的事情,如弹出菜单等,如果不行,可能是程序有错误,我曾经用这种方法写过一个任务栏程序,没问题。
      

  28.   

    2 artgolf:
     你说的那是时钟旁边的图标吧,那个我知道!如果不是,请给出例程!谢谢!
      

  29.   

    也许应该截获任务栏窗口的WndProc。
      

  30.   

    唉,Win2k下找不到任务栏的句柄:(