我想监视用户在任何应用程序中所做的所有文本选择。那可能吗?我更喜欢 .net 中的解决方案,但原版 C++ 是可以的。
如果不是,我可以从 .net 应用程序监视所有文本复制操作 (CTRL+C) 吗?
我想监视用户在任何应用程序中所做的所有文本选择。那可能吗?我更喜欢 .net 中的解决方案,但原版 C++ 是可以的。
如果不是,我可以从 .net 应用程序监视所有文本复制操作 (CTRL+C) 吗?
WM_CLIPBOARDUPDATE
在(隐藏的)窗口中注册和处理消息。
“选择”不是一个通用的概念,每个控件都可以以自己的方式处理它。如果你想拦截每一个选择,你可以在 windows 消息上放置一个全局挂钩,并通过过滤掉那些看起来不错并检查源窗口类(编辑框的选择更改可能是其他控件的核战争开始的通知)。您不会得到所有的选择(例如,Word 中的选择不会被截获),但您可能会想获得其中的绝大多数。
但是有一个大问题:无窗口控件。正如术语本身所说,无窗口控件不是窗口,因此它们没有HWND
s 或任何东西;实际上,它们可以被认为是在屏幕上绘制的像素,没有来自应用程序外部的任何额外接口(它们通常是COM
东西)。你不能钩住它们,你不能子类化它们,而且由于它们通常使用COM
接口来通知它们的所有者(随机示例),你不能子类化它们的所有者来获取他们的通知。当然,可能有一些奇怪的方法来获取它们的内容,但它可能涉及每个进程中的 dll 注入,甚至不如为“普通”编辑框提出的方法通用。
由于无窗口控件非常普遍(例如,使用 DirectUI 的浏览器和应用程序使用它们来避免浪费大量HWND
s,IIRC Office 也使用它们,WPF 应用程序使用它们自己的无窗口控件风格,VB6/Delphi 应用程序可以使用它们, ...),你会错过很多选择,所以我建议你遵循复制拦截的方式,这种方式更简单,更安全。
在这方面,您可以遵循@Richard的建议并使用AddClipboardFormatListener API。请记住,这仅从 Windows Vista 开始可用,因此,如果您想与以前的 Windows 版本兼容,则应使用较旧的“剪贴板查看器”API 集。这里有一些信息。
呃,我忘记了,我正在调查 Active Accessibility(尽管通常没有正确实现)是否可以帮助您完成这项任务,并且有这种很有前途的方法,但事实证明它仅适用于选定的子对象,而且, 一般来说,
客户注意事项 Active Accessibility 不会在编辑和富编辑控件中公开文本选择。
所以,我认为,如果连可访问性都不能提供这样的信息,那么很难有任何其他标准化的方式来获取它。