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

标签 .net c++ windows monitor textselection

我想监控用户在任何应用程序中所做的所有文本选择。那可能吗?我更喜欢 .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?

最佳答案

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

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

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

在这方面,你可以听从@Richard的建议,使用AddClipboardFormatListener应用程序接口(interface)。请记住,这仅适用于 Windows Vista 之后的版本,因此,如果您想与以前的 Windows 版本兼容,您应该使用较旧的“剪贴板查看器”API 集。一些资料here .


编辑

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

Note to clients Active Accessibility does not expose the text selection in edit and rich edit controls.

因此,我认为,即使可访问性也不提供此类信息,也很难有任何其他标准化方法来获取它。

关于.net - 监控任何应用程序中的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3853834/

相关文章:

.net - 使用 redis.io 存储对象

c# - 在另一个用户控件中移动用户控件

c++ - 如何编译支持 NTLM 的 gSoap? (Mac 操作系统)

c++ - 函数的参数有两种模板类型,但只关心一种

windows - 如何增加 Windows 服务可以生成的最大子进程数——桌面堆限制

php - 捕获/查看打印的所有内容(POS/收据)

.net - .net:线程调试

.net - 如何通过 gmail 将整个 .Net 项目作为附件发送?

c++ - '&' 需要 Opengl 中 getTranslation() 函数的左值错误

c# - 使用实时流的语音识别