1

我想监视用户在任何应用程序中所做的所有文本选择。那可能吗?我更喜欢 .net 中的解决方案,但原版 C++ 是可以的。

如果不是,我可以从 .net 应用程序监视所有文本复制操作 (CTRL+C) 吗?

类似的问题:在 C# 中,有没有办法始终如一地获取当前聚焦窗口的选定文本内容?

4

2 回答 2

3

WM_CLIPBOARDUPDATE在(隐藏的)窗口中注册和处理消息。

于 2010-10-04T09:13:41.507 回答
3

“选择”不是一个通用的概念,每个控件都可以以自己的方式处理它。如果你想拦截每一个选择,你可以在 windows 消息上放置一个全局挂钩,并通过过滤掉那些看起来不错并检查源窗口类(编辑框的选择更改可能是其他控件的核战争开始的通知)。您不会得到所有的选择(例如,Word 中的选择不会被截获),但您可能会想获得其中的绝大多数。

但是有一个大问题:无窗口控件。正如术语本身所说,无窗口控件不是窗口,因此它们没有HWNDs 或任何东西;实际上,它们可以被认为是在屏幕上绘制的像素,没有来自应用程序外部的任何额外接口(它们通常是COM东西)。你不能钩住它们,你不能子类化它们,而且由于它们通常使用COM接口来通知它们的所有者(随机示例),你不能子类化它们的所有者来获取他们的通知。当然,可能有一些奇怪的方法来获取它们的内容,但它可能涉及每个进程中的 dll 注入,甚至不如为“普通”编辑框提出的方法通用。

由于无窗口控件非常普遍(例如,使用 DirectUI 的浏览器和应用程序使用它们来避免浪费大量HWNDs,IIRC Office 也使用它们,WPF 应用程序使用它们自己的无窗口控件风格,VB6/Delphi 应用程序可以使用它们, ...),你会错过很多选择,所以我建议你遵循复制拦截的方式,这种方式更简单,更安全。

在这方面,您可以遵循@Richard的建议并使用AddClipboardFormatListener API。请记住,这仅从 Windows Vista 开始可用,因此,如果您想与以前的 Windows 版本兼容,则应使用较旧的“剪贴板查看器”API 集。这里有一些信息。


编辑

呃,我忘记了,我正在调查 Active Accessibility(尽管通常没有正确实现)是否可以帮助您完成这项任务,并且有这种很有前途的方法,但事实证明它仅适用于选定的子对象,而且, 一般来说,

客户注意事项 Active Accessibility 不会在编辑和富编辑控件中公开文本选择。

所以,我认为,如果连可访问性都不能提供这样的信息,那么很难有任何其他标准化的方式来获取它。

于 2010-10-04T10:03:29.923 回答