【问题标题】:Monitor selections in any application监控任何应用程序中的选择
【发布时间】:2011-04-20 17:02:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net c++ windows monitor textselection


    【解决方案1】:

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

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

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

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


    编辑

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 那是为了复制,对吧?是否为所有应用程序触发了消息(不仅仅是我自己的?)。
      • 为所有应用程序触发(见这里:msdn.microsoft.com/en-us/library/ms649033%28v=VS.85%29.aspx
      • @jgauffin:链接的 MSDN 页面告诉您如何将窗口添加到接收消息的窗口。
      • 好的。我会等一天,看看是否有人知道如何监控选择。否则我会接受你的回答。
      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多