有个 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之类的回答。我需要用一种灵活可行的方法。
我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之类的回答。我需要用一种灵活可行的方法。
解决方案 »
- C/S IDtcpclient向IDtcpserver發送數據,在listview上面顯示?
- 怎么用delphi实现php的time()得到的值
- 窗体间参数传递的问题???
- 问个DBGIRD行的问题
- 我下载了 ExpressQuantumGrid 4 Suite,但不知道怎么安装?
- 在桌面上textout出来的文字如何设置(包括字体和大小)?
- 简单的小问题!
- delphi里如何自动注册ODBC数据源 sql server 找错,在线等
- 关于QuickRep的问题,怎么才能将Memo中的内容赋给QRMemo呢?
- 哪里有WAV->MP3的控件
- 简单问题,Qreport如何设置在同一张纸的左右半边都打印detail内容?
- 风马牛不相及的问题,偏偏发生了!!游戏杆和BorderStyle=bsNone之间的感情纠葛
=======================
procedure TForm1.WMLBUTTONDOWN(var msg: TWMLBUTTONDOWN);
begin
showmessage('sadf');
end;
谢谢关注
可能我没有表达清楚我的问题,这样吧:
你在Form上放置一个Panel,然后把Panel设置成为alClient 把你的代码写进去看看,是不是能截获
WM_LBUTTONDOWN;
我的机器(XP,Delphi7)下面是不行
在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;
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;
ApplicationEvents控件就行了。。
你确信看明白我问什么了么?