【问题标题】:Preventing WM_SETCURSOR and WM_NCHITTEST messages from being generated防止生成 WM_SETCURSOR 和 WM_NCHITTEST 消息
【发布时间】:2013-01-14 22:16:01
【问题描述】:

我正在制作一个将自身挂接到目标应用程序的应用程序,当用户激活它时,它会阻止所有键盘和鼠标窗口消息到达目标应用程序的窗口进程。我的应用程序通过将传入的输入消息(例如 WM_MOUSEMOVE)转换为 WM_NULL 来实现这一点,这样窗口 proc 就不会知道发生了输入。

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

我最初通过子类化窗口 proc 并简单地忽略 WM_SETCURSORWM_NCHITTEST 来解决此问题,但子类化似乎与我所使用的某些应用程序存在兼容性问题。

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

【问题讨论】:

  • 只是出于好奇,你为什么想要这样的东西?换句话说,你想达到什么目标,你觉得需要你付出这么大的努力?

标签: winapi


【解决方案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 的人暗示最终会发布他的源代码;他的网站似乎有一些更好的关于 Hooking、Subclassing、Injecting 等的论坛。

听起来你成功使用了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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2019-10-25
    • 2019-05-14
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多