拦截 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
我可以想到几种不同的方法来解决这个问题:
您可以使用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 它的父级,用于进一步的消息处理。
您可以使用 SetWinEventHook()
来监控 EVENT_OBJECT_INVOKED
事件,例如按钮点击。如果您使用 WINEVENT_OUTOFCONTEXT
标志,则不需要 DLL,但需要注意的是安装线程需要一个活动的消息循环,以便可以跨进程边界处理事件。
有人可以指导我找到一个 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
我可以想到几种不同的方法来解决这个问题:
您可以使用
SetWindowsHookEx()
to install aWH_CALLWNDPROC
message hook in the target window's thread, and then the hook callback can process window messages likeWM_LBUTTON(DOWN|UP)
on the target window itself, orBN_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 usingGetWindowThreadProcessId()
。这个的一个变体是
SetWindowsHookEx()
安装一个WH_GETMESSAGE
钩子,然后你可以使用PostMessage()
to post a custom window message to the target window. The hook callback can then useSetWindowLongPtr()
orSetWindowSubclass()
直接子类化目标 window,and/or 它的父级,用于进一步的消息处理。您可以使用
SetWinEventHook()
来监控EVENT_OBJECT_INVOKED
事件,例如按钮点击。如果您使用WINEVENT_OUTOFCONTEXT
标志,则不需要 DLL,但需要注意的是安装线程需要一个活动的消息循环,以便可以跨进程边界处理事件。