在任何应用程序中监视select

我想监视用户在任何应用程序中所做的所有文本select。 那可能吗? 我更喜欢.net的解决scheme,但香草C + +是好的。

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

类似的问题: 在C#中,有没有办法一直能够获得当前聚焦窗口的选定文本内容?

“选择”不是一个普遍的概念,每一个控制都可以用自己的方式处理。 如果你想拦截每一个选择,你可以在Windows消息上放置一个全局钩子,并拦截与“已知”编辑控件(标准编辑控件,RichEdit控件,…)有关的通知,通过筛选出那些看起来不错,并检查源窗口类(对于编辑框,选择更改是什么可能是通知某个其他控件的核战争的开始)。 你不会得到所有的选择(例如在Word中的选择不会被拦截),但是你可能会想到获得绝大多数的选择。

但是有一个很大的问题:没有窗户的控制。 正如这个术语本身所说的,无窗控制不是窗户,所以他们没有任何HWND或任何东西; 实际上,它们可以被认为是在屏幕上绘制的像素,而不需要来自应用程序的外部接口(它们通常是COM东西)。 你不能挂钩它们,你不能将它们继承,因为它们通常使用COM接口来通知它的所有者( 随机的例子 ),所以你不能继承它的所有者来获得他们的通知。 当然,可能有一些奇怪的方法来获取他们的内容,但它可能涉及每个进程的DLL注入,甚至比“正常”编辑框提出的方法一般。

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

在这方面,您可以遵循@Richard的建议,并使用AddClipboardFormatlistner API。 请记住,这只能从Windows Vista开始才能使用,所以如果你想兼容以前的Windows版本,你应该使用旧的“剪贴板查看器”API集。 一些信息在这里 。


编辑

呃,我忘记了,我正在研究主动可访问性(尽管通常没有正确实施 )可以帮助你完成这个任务,并且有这个有前景的方法 ,但是事实证明,它只适用于选定的子对象, , 一般来说,

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

所以,我认为,如果即使可访问性不提供这样的信息,那么有任何其他标准化的方式来获取它是相当困难的。

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