窗口的消息处理问题(100分)

  • 主题发起人 主题发起人 luckystar
  • 开始时间 开始时间
L

luckystar

Unregistered / Unconfirmed
GUEST, unregistred user!
得分的好机会
如果要吃掉一个消息,可以:
procedure Tfrom1.msgprocess(var msg:Tmessage)
begin
end;
写一个空的消息处理过程。但我现在想把这个消息掉包成另一个消息,再调
用窗口处理过程来处理它,我用
procedure Tfrom1.msgprocess(var msg:Tmessage)
begin
msg.msg:=wm_lbuttondown;
end;
不行。在VB下我会做,又是callwindowproc,又是selwindowLong,getwindowLong
什么的,不知在delphi下怎么做?
 
callwindowproc,setwindowLong,getwindowLong这三个api可以在delphi中一样用
 
这个偶也知的,其实在delphi中可以直接调默认的消息处理过程,用inherited,
比如
procedure Tform1.proc(var msg:Tmessage);
begin
inherited;//////
if msg.Result=HtClient then
msg.Result:=HtCaption;
end;
我想知道在delphi中最初是怎么做的?我看了control.pas的源码,里面的WndProc过程
很简单,没有我想象中那些API,倒是有几个奇怪的函数比如说include,exclude不知是干
什么的,找不到这几个函数的声明。

另外,请看做记号处,这里调的应该是Tform的WndProc过程,为什么我用
inherited WndProc(msg);
运行时会出错?
 
直接将消息掉包成另一个消息是不行的,要将相应的Message的数据也赋值
 
这个问题怎么这么多;

OldProc := WindowProc; // form 的 WindowProc
WindowProc := msgProcess;

在 msgProcess 最后调用 oldproc(msg);
 
把左键消息换成右键消息,在VB 中可以这么做:

自定义窗口过程:
Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_RBUTTONDOWN Then
Msg = WM_LBUTTONDOWN
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function

把窗口的消息处理过程换成自己的:

Private Sub Command1_Click()
prevWndProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
SetWindowLong Text1.hWnd, GWL_WNDPROC, AddressOf WndProc
Command1.Enabled = False
End Sub

在VB中,就是把消息掉换后,调用窗体原来的消息处理过程的
都说delphi是面向对象的了,为什么我调缺省的消息处理过程不行呢?
msg.msg:=wm_lbuttondown;
inherited;
就不行?
 
kill night 说的能捕获 windows 标准的消息,

试一试我的方法, 肯定行的。
 
多人接受答案了。
 
后退
顶部