关于消息拦截的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 waxing
  • 开始时间 开始时间
W

waxing

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体上放一个Panel1和Button1 用下面代码可以拦截到鼠标移动到控件上的消息
private

procedure wndproc(var msg:Tmessage);override ;

procedure TMainAdoform.wndproc(var msg: Tmessage);
begin
if msg.LParam = longint(Panel1) then
begin
if (msg.Msg = cm_mouseenter) then
showmessage('鼠标已经到在Panel1上');
end;
if msg.LParam = longint(Button1) then
begin
if (msg.Msg = cm_mouseenter) then
showmessage('鼠标已经到在Button1上');
end;

inherited wndproc(msg) ;
end;
当我把Button1不直接放在窗体上而放在Panel1中下面代码只能拦截到Panel1。不能拦截到
Button1上。拦截过程应该如何写?[red]才能拦截到放在Panel1中的Button1[/red]鼠标移动消息?

private

procedure wndproc(var msg:Tmessage);override ;

procedure TMainAdoform.wndproc(var msg: Tmessage);
begin
if msg.LParam = longint(Panel1) then
begin
if (msg.Msg = cm_mouseenter) then
showmessage('鼠标已经到在Panel1上');
end;
if msg.LParam = longint(Button1) then
begin
if (msg.Msg = cm_mouseenter) then
showmessage('鼠标已经到在Button1上');
end;

inherited wndproc(msg) ;
end;
 
你搜索一下子类化,采用子类化来处理,可以拦截绝大多数的消息。
 
[red]才能拦截到放在Panel1中的Button1[/red]鼠标移动消息?
在TPanel1的wndproc中写,Panel1: TPanel1;
 
替换Button的wndproc
 
等等 我帮你写 就喜欢写消息拦截
 
implementation
var
OldProc:FARPROC;
{$R *.dfm}
function NewProc(hwnd:Hwnd;msg:Uint;wparam:WPARAM;lparam:lparam):LRESULT;stdcall;
begin
Result:= 0;
case Msg of
CM_MOUSEENTER:
begin
ShowMessage('鼠标已经到在button1上');
Result:= 1;
end;
CM_MOUSELEAVE:
begin
ShowMessage('鼠标已经离开button1上');
Result:= 1;
end;
else
Result:= CallWindowProc(Pointer(OldProc),hwnd,msg,wparam,lparam);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OldProc:= FARPROC(GetWindowLong(Button1.Handle,GWL_WNDPROC));
SetWindowLong(Button1.Handle,GWL_WNDPROC,Longint((@NewProc)));
end;

用了上面老兄的说发,替换窗口过程 不过没有反映 。我仔细看了这个消息是delphi 中定义的, 不知道 在delphi是怎么处理的。 实在不行 就得用钩子了 。不过我觉的应该没有那么麻烦的。写了这么多的消息拦截,竟然搞不定了。
 
其实没有那么复杂
楼上的大哥看来是API高手,呵呵
其实控件的wndproc可以直接操作
procedure newProc(var Msg: TMessage);
begin
//你的处理代码
oldProc
end;

formCreate里加入
OldProc := Button1.wndproc;
button1.wndproc := newProc;
就OK了
 
[red]就是拦截不直接放在窗体上而放在容器上的控件的消息[/red]
 
CM_MOUSEENTER=45075,
CM_MOUSELEAVE=45076,
均大于WM_USER=1024。
所以说你用截获windows消息的方法是截不到的。
要拦截在控件上的MOUSE移动消息:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnApplicationMessage;
end;


procedure TForm1.OnApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.hwnd = Panel1.Handle then
begin
if Msg.message = WM_MOUSEMOVE then
begin
ShowMessage('鼠标已经到在Panel1上');
end;
end;
if Msg.hwnd = Button1.Handle then
begin
if Msg.message = WM_MOUSEMOVE then
begin
ShowMessage('鼠标已经到在Button1上');
end;
end;
end;
可以拦截Windows消息,但不能判断CM_MOUSEENTER(你可以看看Delphi是怎么做的)。
注意处理是否有其它的Application.OnMessage事件句柄。
 
后退
顶部