拦截 windows 鼠标点击

Intercepting windows mouse click

有人可以指导我找到一个 windows API 函数来拦截鼠标点击特定 window 上的某个按钮。我使用过 spy ++ 并了解到,当我将 finder 工具移动到按钮或 window 中的任何东西时,我能够读取有关处理程序和其他东西的信息。那么有没有一种方法可以在执行某些操作之前拦截鼠标点击并注入我们的代码。非常感谢您分享有关此的任何想法。

您需要致电 SetWindowsHookEx API to set a windows hook. Here's an article with source code, that demonstrates its usage: Hooks and DLLs

我可以想到几种不同的方法来解决这个问题:

  1. 您可以使用SetWindowsHookEx() to install a WH_CALLWNDPROC message hook in the target window's thread, and then the hook callback can process window messages like WM_LBUTTON(DOWN|UP) on the target window itself, or BN_CLICKED on the target window's parent. The caveat is the callback needs to be implemented in a DLL so the hook can be injected into the target process. You can get the target window's thread ID using GetWindowThreadProcessId()

    这个的一个变体是 SetWindowsHookEx() 安装一个 WH_GETMESSAGE 钩子,然后你可以使用 PostMessage() to post a custom window message to the target window. The hook callback can then use SetWindowLongPtr() or SetWindowSubclass() 直接子类化目标 window,and/or 它的父级,用于进一步的消息处理。

  2. 您可以使用 SetWinEventHook() 来监控 EVENT_OBJECT_INVOKED 事件,例如按钮点击。如果您使用 WINEVENT_OUTOFCONTEXT 标志,则不需要 DLL,但需要注意的是安装线程需要一个活动的消息循环,以便可以跨进程边界处理事件。