★★WM_WINDOWPOSCHANGING这个消息如何截获?
在窗体上放一个ApplicationEvents1控件,在其OnMessage事件中加上:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message = WM_WINDOWPOSCHANGING then
  begin
    messagebeep(mb_ok);
  end;
end;
在窗体上放一个Button1,在起OnClick事件中加上:
procedure TForm1.Button1Click(Sender: TObject);
begin
   sendmessage(form1.Handle,WM_WINDOWPOSCHANGING,$00000000,$0012F6D0);
end;
我特意的在一个按钮的事件中发送WM_WINDOWPOSCHANGING这个消息,居然不能截获!!ApplicationEvents的OnMessage事件不是能截获所有的消息吗?为什么这个消息不能截获?请各位高手指导,谢谢!

解决方案 »

  1.   

    方法一:
    //自定义方法
    procedure TForm1.MyProce(par1:type....)Message WM_WINDOWPOSCHANGING;
    方法二:
    //自定义方法
    procedure TForm1.MyProce(var Msg:TMessage);
    begin
      if Msg.wParam=WM_WINDOWPOSCHANGING then
    ......................
    ................
    end;
      

  2.   

    因为你没有procedure TForm1.MyProce(par1:type....)Message WM_WINDOWPOSCHANGING;
    Message WM_WINDOWPOSCHANGING;很重要
      

  3.   

    to;楼上的
    ApplicationEvents的OnMessage事件不是能截获所有的消息吗?
      

  4.   

    推荐使用lwuser的方法一
    ApplicationEvents的OnMessage只能捕获传递给Application这个对象的消息,其它的是无能为力的。帮助里TApplicationEvents的OnMessage页的第一行已经说得很明白了。
      

  5.   

    Windows消息分两种,一个是进队的消息,一个是不进队的消息
    OnMessage只能捕获进队的消息,象一般的键盘消息,鼠标消息,WM_PAINT,WM_TIMER这些消息
    而你的SendMessage是直接调用窗口过程,所以OnMessage是收不到的,即使用PostMessage也不好使,因为WM_WINDOWPOSCHANGING就是进队消息,

      if PostMessage(Handle,WM_WINDOWPOSCHANGING,$00000000,$0012F6D0) then
        ShowMessage('succeed')
      else
        RaiseLastOSError;会弹出  "消息只能与同步操作一起使用",PostMessage不成功
      

  6.   

    我说错了,应该为
    WM_WINDOWPOSCHANGING就不是进队消息