监控任何应用程序中的选择

时间:2010-10-04 09:00:51

标签: .net c++ windows monitor textselection

我希望监控用户在任何应用程序中所做的所有文本选择。那可能吗?我更喜欢.net中的解决方案,但vanilla C ++还可以。

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

类似的问题:In C#, is there a way to consistently be able to get the selected text contents of currently focused window?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

“选择”不是一个普遍的概念,每个控件都可以以自己的方式处理它。如果要拦截每个选择,可以在Windows消息上放置一个全局钩子,并截取相对于“已知”编辑控件(标准编辑控件,RichEdit控件......)的通知,过滤掉那些看起来很好并检查源窗口类(编辑框的选择更改可能是某些其他控件的核战争开始的通知)。你不会得到所有选项(例如,Word中的选择不会被拦截),但你可能会认为它们占绝大部分。

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

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

在这方面,您可以按照 @Richard 的建议使用AddClipboardFormatListener API。请记住,这仅适用于Windows Vista以上版本,因此,如果您希望与以前的Windows版本兼容,则应使用较旧的“剪贴板查看器”API集。一些信息here

<小时/> 修改

呃,我忘了它,我正在调查Active Accessibility(虽然often not properly implemented)是否可以帮助你完成这项任务,并且this promising method,但事实证明它只适用于选中子对象,一般来说,

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

所以,我认为,即使可访问性不能提供这样的信息,也很难有任何其他标准化方法来获取它。