有个 Form 在 Form上面覆盖了 Panel,
我override
procedure TForm1.WndProc(var Message: TMessage);
begin
 inherited;
  if Message.Msg = WM_LBUTTONDOWN  then
  begin
    ShowMessage('s');
  end ;
end;
处理我的一些要求。但是由于Form覆盖着 Panel的缘故。 所以不能 捕获这个消息。 有没有什么办法这样: 
不管点击Form上任何一个地方,(包括容器,容器里面的Edit,Button,Label.....)都能够截获 这个 WM_LBUTTONDOWN  别告诉一个个去写click之类的回答。我需要用一种灵活可行的方法。

解决方案 »

  1.   

    procedure WMLBUTTONDOWN(var msg: TWMLBUTTONDOWN); message WM_LBUTTONDOWN;
    =======================
    procedure TForm1.WMLBUTTONDOWN(var msg: TWMLBUTTONDOWN);
    begin
      showmessage('sadf');
    end;
      

  2.   

    TO:xixuemao(俺可是㊣②㈧经儿滴人) 
    谢谢关注
    可能我没有表达清楚我的问题,这样吧:
    你在Form上放置一个Panel,然后把Panel设置成为alClient  把你的代码写进去看看,是不是能截获
    WM_LBUTTONDOWN;
    我的机器(XP,Delphi7)下面是不行
      

  3.   

    楼上的不行,Form1的消息响应不会执行。
    在Panel1上放一个button1,在button1.OnClick响应事件中随便写点东西如ShowMessage('abcd'),然后在OnClick响应事件中设置断点,Delphi--Options--Compiler中勾上use debug dcus,运行程序调试,到达断点时,Delphi--View--Debug Windows--Call Stack,可以看到调用顺序:
    -------------------------------------------------
    TForm1.Button1Click($CF396C)
    TControl.Click
    TButton.Click
    TButton.CNCommand((48401, 1054, 0, 394270, 0))
    TControl.WndProc((48401, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    TWinControl.WndProc((48401, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    TButtonControl.WndProc((48401, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    TControl.Perform(48401,1054,394270)
    DoControlMsg(394270,(no value))
    TWinControl.WMCommand((273, 1054, 0, 394270, 0))
    TControl.WndProc((273, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    TWinControl.WndProc((273, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    TWinControl.MainWndProc((273, 1054, 394270, 0, 1054, 0, 1054, 6, 0, 0))
    StdWndProc(525398,273,1054,394270)
    TWinControl.DefaultHandler((no value))
    TControl.WMLButtonUp((514, 0, 26, 14, (26, 14), 0))
    TControl.WndProc((514, 0, 917530, 0, 0, 0, 26, 14, 0, 0))
    TWinControl.WndProc((514, 0, 917530, 0, 0, 0, 26, 14, 0, 0))
    TButtonControl.WndProc((514, 0, 917530, 0, 0, 0, 26, 14, 0, 0))
    TWinControl.MainWndProc((514, 0, 917530, 0, 0, 0, 26, 14, 0, 0))
    StdWndProc(394270,514,0,917530)
    TApplication.HandleMessage
    TApplication.Run
    Project1
    -------------------------------------------------从调用堆栈看,我觉得用Application.OnMessage响应比较方便,不知能否满足搂主要求:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       Application.OnMessage := AppMessage;
    end;procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Self.Active = false then
       exit;  if (Msg.message = WM_LBUTTONDOWN) then
      begin
        ShowMessage('bbbb');
        Handled := true;
      end;  { for all other messages, Handled remains False }
      { so that other message handlers can respond }
    end;
      

  4.   

    用 FlashWindowExvar FWinfo: TFlashWInfo;
    begin
      FWinfo.cbSize := SizeOf(FWinfo);
      FWinfo.hwnd := Application.Handle;
      FWinfo.dwflags := FLASHW_ALL or FLASHW_TIMERNOFG;
      FWinfo.ucount := 10000;
      FWinfo.dwtimeout := 10000;
      FlashWindowEx(FWinfo);
    end;
      

  5.   

    参数应该改为: FLASHW_TIMER or FLASHW_CAPTION
      

  6.   

    TO: fjx99(fjx99)  可否不用    Application.OnMessage  要不我直接用
    ApplicationEvents控件就行了。。
      

  7.   

    to Idle_(阿呆)  
    你确信看明白我问什么了么?
      

  8.   

    是的, 如果当前窗口setcapture的话, 即使鼠标在其他窗口中产生的消息也会通知到你的窗口里来, 但是只到WM_LBUTTONDOWN为止, 因为其他窗口接收到WM_LBUTTONDOWN后就会抢走你的mouse capture了.