防止生成WM_SETCURSOR和WM_NCHITTEST消息

时间:2013-01-14 22:16:01

标签: winapi

我正在创建一个将自身挂钩到目标应用程序的应用程序,并在用户激活时阻止所有键盘和鼠标窗口消息到达目标应用程序的窗口proc。我的应用程序通过将传入的输入消息(例如WM_MOUSEMOVE)转换为WM_NULL来完成此操作,以便窗口proc不会发生意外输入。

问题是,当鼠标输入发生时,Windows还会自动将WM_SETCURSORWM_NCHITTEST发送到窗口proc(例如,当应用程序调用{​​{1}}时)。这些消息不会发布到窗口的消息队列中,因此我无法将它们更改为WM_NULL。

我最初通过子类化窗口proc并在那里忽略PeekMessageWM_SETCURSOR来解决这个问题,但是子类化似乎与我所连接的一些应用程序存在兼容性问题。

我的问题是:如何阻止首先生成WM_NCHITTESTWM_SETCURSOR 如何阻止它们到达应用程序的窗口过程。

1 个答案:

答案 0 :(得分:1)

尝试的一些想法

我刚刚使用WH_CALLWNDPROCRET Windows Hook完成了一个全局/系统范围的CallWndRetProc实现(就像它在下面链接的过去帖子中描述的那样)。

http://help.lockergnome.com/windows2/Igor-SetCursor-SetWindowsHookEx--ftopict285504.html

结合使用SetSystemCursor隐藏所有系统游标,有效地隐藏了大多数应用程序的光标。

如果您想继续攻击此目标应用程序,可以尝试使用API​​ Monitor来诊断正在发生的事情:http://www.rohitab.com/apimonitor

rohitab的家伙暗示最终发布他的源代码;他的网站似乎有一些关于钩子,子类,注入等的更好的论坛。

听起来你成功使用了SetWindowLongPtr(),但是有几种不同的方法可以进入你正在处理的程序的地址空间......

您是否尝试过SetCapture()

其他链接

以下是一些可能有用的其他链接:

http://support.microsoft.com/kb/31747

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646262(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633569%28v=vs.85%29.aspx#winproc_subclassing

http://msdn.microsoft.com/en-us/library/windows/desktop/ms648395(v=vs.85).aspx

希望有所帮助。祝你好运。