【问题标题】:C# Detect clipboard paste WITH HOOKC# 用 HOOK 检测剪贴板粘贴
【发布时间】:2017-07-09 13:06:07
【问题描述】:

是否可以在 Windows 上全局拦截粘贴事件并根据目标进程进行阻止,使用适用于 C# WinForms 任何 CPU 构建的挂钩?

我想过在GetClipboardData 中添加一个钩子,或者等待 WM_PASTE 消息。

我的第一次尝试是SetWindowsHookEx,但又一次让我灰心。

MSDN says:

.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


【解决方案1】:

没有理想的解决方案来检测粘贴事件。就像 RbMm 所说的 WM_CLIPBOARDUPDATE 只会在剪贴板中的内容发生更改时发送。 (复制或剪切)。 WM_DESTROYCLIPBOARD 在粘贴操作期间发送,但前提是剪贴板中的内容是使用剪切操作添加的。

但是您可以通过实现文件系统过滤器驱动程序来实现这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2017-12-23
    • 2015-07-29
    • 2013-07-08
    相关资源
    最近更新 更多