关于网友提出的“ 自写控件消息捕获的问题”问题疑问,本网通过在网上对“ 自写控件消息捕获的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 自写控件消息捕获的问题
描述: 我写了个控件继承自TCustomControl,我想叫它捕获到系统内所有的鼠标点击事件.无论是点击它自身还是别的窗口,这样的代码要怎么写?
另外问下直接继承自TCustomControl的组件应该怎么捕获CM_MOUSEENTER和CM_MOUSELEAVE这两个消息.
解决方案1: 不错不错,呵呵
解决方案2: 1、我写了个控件继承自TCustomControl,我想叫它捕获到系统内所有的鼠标点击事件.无论是点击它自身还是别的窗口,这样的代码要怎么写?
-----------------------------------------------------------------------------------
这个最好要使用全局钩子技术;
2、另外问下直接继承自TCustomControl的组件应该怎么捕获CM_MOUSEENTER和CM_MOUSELEAVE这两个消息.
---------------------------------------------------------------------------------
这2个消息的捕获楼上已经说了,方法你使用楼上的就可以了;
解决方案3: 用钩子
解决方案4: 它捕获到系统内所有的鼠标点击事件
//-------------------
??系统内所有??
//-----------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TXCustomControl = class(TCustomControl)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
end;
TForm1 = class(TForm)
Bevel1: TBevel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TXCustomControl }
procedure TXCustomControl.CMMouseEnter(var Message: TMessage);
begin
inherited;
Canvas.TextOut(2,2,'enter');
Message.Result := 1;
end;
procedure TXCustomControl.CMMouseLeave(var Message: TMessage);
begin
inherited;
Canvas.TextOut(2,2,'leave');
Message.Result := 1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with TXCustomControl.Create(Self) do
begin
Parent := Self;
SetBounds(10, 10, 50, 50);
Color := clRed;
end;
end;
end.
解决方案5: 那就只能用全局消息钩子了,截获消息
以上介绍了“ 自写控件消息捕获的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2266420.html