可以拦截Application.OnMessage事件。

解决方案 »

  1.   

    为什么不能给控件的方法加上侦测消息的语句?
    这几句话是错的,可以给控件的方法加,但是需要有个TMessage或TMsg类型的参数。
      

  2.   

    还有一个地方可以拦截消息使用 Application的HookMainWindow方法
      

  3.   

    昨天我才给别人回复了一个这种方法,结果你又提出来,唉!procedure TForm1.FormCreate(Sender: TObject);
    var
      FButtonInstance: TFarProc;
    begin
      FButtonInstance := MakeObjectInstance(ButtonWndProc); // 转化一下
      FDefWndProc := Pointer(GetWindowLong(Button1.Handle, GWL_WNDPROC)); // 取原来的窗口函数
      SetWindowLong(Button1.Handle, GWL_WNDPROC, Longint(FButtonInstance)); // 设置成咱们自己的
    end;procedure TForm1.ButtonWndProc(var Message: TMessage);
    begin
      // 这里会传入Button1的消息,你可以用Message来判断消息和处理
      // 用下面的语句调用它原来的处理。
        with Message do
          Result := CallWindowProc(FDefWndProc, Button1.Handle, Msg, wParam, lParam);
    end;
      

  4.   

    to all:人家问的是控件,不是应用。
    to linux:不明白你的意思。写控件时经常要用到消息处理啊,这句 procedure Button1Click(Sender:TObject);message WM_ACTIVATE;很有问题。须知wm_activate在窗口世界中是非常频繁的。你想干什么?
      

  5.   

    to agui(阿贵),听你说话的口气象已经50岁啦!
      

  6.   

    在WM_ACTIVATE中调用Button1Click就行了,何必要这么麻烦呢
      

  7.   

    比如我现在要响应一个从资源管理器拖放到我的ToolBar控件上的一个拖放消息,我该如何做呢?
      

  8.   

    要使用ShellAPI注册的,然后资源管理器才会给你发消息的,参考ShellAPI吧!老弟!
      

  9.   

    必须uses ShellApi;1、在FormCreate用DragAcceptFiles(Handle, True)登记一下;
    2、增加一个消息响应方法:
    procedure WMDropFiles(var msg: TWMDropFiles); message WM_DROPFILES;
    当资源管理器拖动文件到你的窗体时,会有这个消息发生。
    其中的msg.Drop是一个句柄,使用它,你用DragQueryPoint可以查询拖放到的点, 用DragQueryFile查询文件名,最后记住用DragFinish释放系统分配的内存。看看API的帮助吧。祝你好运!
      

  10.   

    不是啊,我想要侦测的是ToolBar控件上的消息,而不是窗口消息呀,意思就是当一个文件拖放路过ToolBar控件时,可以侦测到这个消息(文件是外部文件,比如说是桌面或是磁盘系统上的)!
      

  11.   

    不是啊,我想要侦测的是ToolBar控件上的消息,而不是窗口消息呀,意思就是当一个文件拖放路过ToolBar控件时,可以侦测到这个消息(文件是外部文件,比如说是桌面或是磁盘系统上的)! 
      

  12.   

    不是啊,我想要侦测的是ToolBar控件上的消息,而不是窗口消息呀,意思就是当一个文件拖放路过ToolBar控件时,可以侦测到这个消息(文件是外部文件,比如说是桌面或是磁盘系统上的)!