有关message的几个问题(50分)

  • 主题发起人 主题发起人 Another_eYes
  • 开始时间 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 有否可能截断windows通过SendMessage发送给其他wincontrol的message?
要求: 不光是监视, 而且要修改该message. (比如WM_PAINT)
2. 如果我不想Invisible某个控件, 能否将这个控件所收到的mouse或keyboard的消息
传递给被这个控件遮住的控件上?
 
用Windows的钩子函数吧!
用SetWindowsHookEx()安一个钩子,
用CallNextHookEx()调用钩子链中得到下一个钩子,
用UnHookWindowsHookEx()把钩子函数从系统中移走。
在钩子链中传消息时即可修改其Message.

有关的钩子类型:
1.WH_CALLWNDPROC 在SendMessage()函数被调用时,产生一个
窗口过程钩子调用,允许修改该消息
2.WH_CALLWNDPROCRET 在SendMessage()函数返回之后,产生一个
窗口过程钩子调用,仅于Windows95下使用。
3.WH_CBT 一个基于计算机的钩子调用,发生在激活、
创建、关闭、极小化、极大化、搬移、或改
变一个窗口的大小之前,在完成一个系统命
令之前,在清除一个鼠标或键盘命令之前,
在设置输入焦点之前,以及在同步系统消息
队列之前。
4.WH_MSGFILTER 一个应用程序消息钩子,调用发生在一个对
话框、消息框、或是菜单已接受了一个消息
之后,但在该消息真正被处理之前。
5.WH_SYSMSGFILTER 一个系统范围的消息钩子,在一个对话框、
消息框、或是菜单接受到一个消息之后调用,
但在该消息真正被处理之前。

PS: 我这里共有13种钩子的说明,需要的话说一声。
 
茶叶蛋兄:
您好!
我有钱达智先生的关于HOOK的笔记单用不了
能烦劳您把13种钩子的说明,例子寄给我好吗?
<a href=mailto:xftang@shtdu.edu.cn>Email:xftang@shtdu.edu.cn</a>
 
关于第一条:
可以参看《delphi3开发使用手册》第31章,
WM_CALLWNDPROC 当SendMessage被调用时,产生调用,而且允许修改该函数

还可以查VC5.0的help,比delphi 的Win32 help好多了

关于第二条:
可以在你的控件上使用wm_journalplayback,发现有消息时,传给要发给的
控件即可。
 
1. CallWndProc Hook can or can not edit the Message???
^^^ ^^^^^^^
the following document copied from win32.hlp shipped with D3:

The CallWndProc hook procedure is an application-defined or library-
defined callback function that the system calls whenever the
SendMessage function is called. Before passing the message to the
destination window procedure, the system passes the message to the
hook procedure. The hook procedure can examine the message; it cannot
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
modify it.
^^^^^^^^^
???????

2. WH_JOURNALPLAYBACK hook is a global hook. It's too complicated for
my codes.
What I need is that I can PASS the message sending to my component on to the components behind mine, in correct positions. (I dont know
which and how many components would be hidden by mine).
 
hi, Another_eYes

Sorry,CallWndProc can't changed the message!!!
I'll check the question later!
 
Re: 唐晓锋
真是对不起,大部分说明都在书上,也就是说,都得靠我慢慢敲.这样好了,
我先敲简介,后面的慢慢来.好吗?

Hi,Another_eYes,如果想简单一点,获取控件句柄(对不起,说错了,
应该是HINSTANCE或HWND)后,再来一个SendMessage好了,不过说老实
话,这样不太可靠,我还是喜欢用journalplayback钩子。
依次取得每个控件(之前在Tag属性里放好标志),再发送消息就是了。
 
re:茶叶蛋
先谢了!
 
TO 唐晓锋:近来比较忙,我的HOOK范例一旦完成就MAIL给你!
建议:大家去搞一套MSDN(Microsoft developer network)CD*2,虽然不是FOR DELPHI
的,但是有的东西的确不错!
 
关于问题2, 我到想出一个办法传递mouse message, 尽管代码比较长, 但方法简单
因为mouse的message都是通过postmessage发送的, 所以可以用GetMessage的hook,
更直接的当然是Application.OnMessage事件了, mouse message传递中最麻烦的就
是mouse的坐标了, 得把当前message中的坐标改成接收方control的坐标才行, 这可
以通过ClientToScreen, ScreenToClient实现.
我的思路是, 在Application.OnMessage中:
1. 判断是否发给我关心的特定的control, 并且这个cotrol是否需要传递mouse消息
2. 如果是则判断消息是否在$0200和$0209之间, 如果是则转换Msg.LParam成Parent
中的坐标.
3. 找到Parent中这个control的index, 因为被遮住的control都在这个index之
前, 所以只需从这个control的前一个开始查找, 用PtInRect判断mouse坐标落在哪
个control上, 找到就转换坐标成那个control的坐标填入LParam,把目的地置成该
control, 如果没找到则把目的地置成Parent.
4. 把handled置成false, 让message继续传递.

不知是否可行?

关于第一个问题我希望快点得到答案.
 
奇怪,难道我的回答文不对题?
不是可以用钩子截断windows通过SendMessage发送给
其他wincontrol的message吗?
不是可以在获得消息后传递时,修改该消息吗?
 
Another_eYes,我觉得,你的想法可能有点麻烦。
首先,您的老鼠经过每一个控件时,都会发送一个消息,如果简单考虑
的话,按时响应这个消息就行了,事实上,Delphi改变移到控件上的鼠
标形状用的就是这种方法。我想,这也是最省事的方法。
我的那本西蒙与舒斯特出版社的VC高级开发指南上有这条消息,嘻嘻,
很久不用,都忘光了。明天这本书一到手,我就贴上来。
 
PS: 谁有MSDN(Microsoft developer network),一定告诉我在哪,
只要在教育网内,哪怕是2CD我也要拖下来。我找它可不是一天两天了。
 
TO 茶叶蛋兄:MSDN我的确有,可是是买的CD(托人刻的),如果那为大侠愿意往
FTP上发,那么我愿意贡献!与我联系!上海
 
To: 茶叶蛋
1. sendmessage的消息在hook中传递时能修改吗? 按win32.hlp的说法: 不能.

2. 你的办法我早就想到过, 有2个弊端:
1. 如果我需要动态指定哪个控件不接受消息而传递给它遮住的控件怎么办? 重写
所有控件?
2. 在控件中定义message方法只能针对特定message, 这样我要传递mouse消息至少
需要写9个方法, 太繁了吧? 而上例中我只需判断Msg号是否在WM_MOUSEMOVE和
WM_MBUTTONDBLCLK之间就行了($0201-$0209), 不管用那种方法, Msg.LParam中
的鼠标位置坐标都需转换(因为它是相对于当前控件client的相对坐标)
 
TO CJ:
<font color=red><big><big>万分感谢!</big></big></font>
 
To CJ and ALL
MS's Visual Studio 6 里有MSDN Library
我刚发现!
 
试一下
TwinControl( ).PerForm( );
 
答案未解决
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部