选择Hook类型的问题(100分)

  • 主题发起人 主题发起人 山药蛋
  • 开始时间 开始时间

山药蛋

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:<br>哪种类型的Hook能用来监视一个由PostMessage发出的消息<br>(就是在这个消息到达目的窗口前拦截下来)?<br>查了MSDN,十几种类型的Hook,只提到适用于SendMessage<br>的类型,是不是这个类型也能截PostMessage呢?<br>我试过别的几种可能的类型,都不行。
 
WH_GETMESSAGE
 
PostMessage是把消息发到消息队列 可以直接拦截。
 
这个我试过了,能获得PostMessage发的消息但不能拦截,就是说获得消息是在窗口线程收到消息之后,这样无法对消息进行及时修改。有没有其他类型能在线程收到消息之前拦下来,待修改后再发给目的线程?<br>具体说,我是想拦截并修改WM_CHAR消息,但该消息是PostMessage发出的,不是WM_KEYDOWN经 TranslateMessage后发出的。这样WH_KEYBOARD就没用了,不知道有没有别的方法(不仅限于Hook)能达到我的目的?
 
不是吧?<br>帮助中说消息会先发到钩子,而且可以修改
 
from MSDN:<br>=============<br>The GetMsgProc function is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The system calls this function whenever the GetMessage or PeekMessage function 【has retrieved a message】 from an application message queue. 【Before returning】 the retrieved message to the caller, the system passes the message to the hook procedure. <br>============<br>注意【】的部分。<br>我的理解是:Hook被调用是在目的程序收到消息之后,发回确认信息之前,这样对目的程序的执行并不能产生影响,对不?<br><br>
 
Before returning the retrieved message to the caller, the system passes the message to the hook procedure.<br>这里caller是调用GetMessage的应用程序,而不是调用PostMessage的那个<br>PostMessage发消息是不存在你所说的确认信息的<br><br>你再看看Remarks里的一段:<br>The GetMsgProc hook procedure can examine or modify the message. After the hook procedure returns control to the system, the GetMessage or PeekMessage function returns the message, along with any modifications, to the application that originally called it.
 
程序不调用GetMessage 或 PeekMessage就不能获得消息队列里的消息吗?<br>我用VC带的spy++监视了收消息的线程,当我用Hook修改那个WM_CHAR后,spy++监视到的消息的确被修改了,但是收消息的线程收到的还是未经修改的那个消息。所以我才认为修改发生在接收之后,spy++取消息也是在线程的接收之后。
 
这就奇怪了!我的被监视窗口(没源代码)的消息就是没法被修改!<br>程序有没可能不用GetMessage和PeekMessage取消息WM_CHAR,从而绕过这个钩子?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2414531<br>有一个例子,修改全局键盘按键值,你看看行不行。
 
我照着weiwei的程序也编了一个,为了方便调试,就用一个程序。<br>自己监视自己,改自己Post自己的WM_CHAR。<br>结果真是晕死,仍然改不了!<br>Post的时候是'x';拦截函数也能起作用(单步跟踪的),看着'x'被改为'a';spy++也显示改了;可是Edit上显示出来的还是'x'!
 
savetime给的例子我也试过,把程序改成截WM_KEYDOWN的话截按键输入就没问题了。<br>但问题是我要监视的线程是在用WM_CHAR模拟键盘输入,WM_KEYDOWN和WM_KEYUP都没有用到的。
 
有意思<br>你是什么系统?我是98<br>你说这个问题是WM_CHAR独有的,那么有可能与WM_CHAR消息的lParam有关
 
我的系统是XP。
 
从原理上说,只要是使用 WH_GETMESSAGE 就可以修改使用 GetMessage 和 PeekMessage<br>的消息,对于直接使用 CallWindowProc 的是改不了的。<br><br>&gt;&gt; 自己监视自己,改自己Post自己的WM_CHAR。<br>&gt;&gt; 结果真是晕死,仍然改不了!<br>是不是没有使用 WH_GETMESSAGE?
 
使用了,而且spy++(M$写的工具)也显示我改到了,就是接收程序自己不知道从哪里取回了原来的WM_CHAR,难道98下是先Hook后目的程序,XP下就倒个顺序?<br>[:(][:(!][?]
 
可以HOOK postmessage API,不就行了
 
问题已经解决,改用的子类化。<br>hook在xp下看来是不行了,也许是nt的安全机制在起作用。<br>多谢各位关注,请收分!
 
后退
顶部