【发布时间】:2017-07-09 13:06:07
【问题描述】:
是否可以在 Windows 上全局拦截粘贴事件并根据目标进程进行阻止,使用适用于 C# WinForms 任何 CPU 构建的挂钩?
我想过在GetClipboardData 中添加一个钩子,或者等待 WM_PASTE 消息。
我的第一次尝试是SetWindowsHookEx,但又一次让我灰心。
.NET Framework 不支持全局挂钩 除了 WH_KEYBOARD_LL 低级挂钩和 WH_MOUSE_LL 低级挂钩,您无法在 Microsoft .NET Framework 中实现全局挂钩。要安装全局挂钩,挂钩必须具有本机 DLL 导出,以便将自身注入另一个需要有效、一致的函数才能调用的进程。此行为需要 DLL 导出。 .NET Framework 不支持 DLL 导出。托管代码没有函数指针一致值的概念,因为这些函数指针是动态构建的代理。
【问题讨论】:
-
@JonathonReinhart 你看到文章日期了吗?文章 ID:318804 - 最后评论:2009 年 3 月 19 日 - 修订:1
-
你需要通过调用
AddClipboardFormatListener来创建一个剪贴板格式监听器 - -
嗨@RbMm,那么,在使用 AddClipboardFormatListener 时,如何检测应用程序何时获取剪贴板数据?这不是在用户复制数据时才调用吗?
-
当剪贴板内容发生变化时,
WM_CLIPBOARDUPDATE将被发送到您的窗口 -
@Vinicius 根本没有系统事件或剪贴板挂钩可满足您的需求。剪贴板仅在新数据放置在剪贴板上时通知,而不是在检索数据时通知。因此,您必须求助于每个进程的 API 挂钩,而在 .NET 中您不能轻易做到这一点。
GetClipboardData并不是唯一用于检索数据的 API。例如,OleGetClipboard。
标签: c# .net windows winapi hook