【问题标题】:C# , detect selected text on windows?C#,检测窗口上的选定文本?
【发布时间】:2009-11-26 12:59:16
【问题描述】:

我会做一个类似谷歌工具栏翻译功能的工具,但它是用于桌面的。 我想做的是 突出显示任何应用程序中的文本(word、pdf、live messenger 等),并通过 google translate api 进行翻译,作为工具提示返回。

我搜索过有关监控文本的 msdn,我只发现使用复制粘贴和监控剪贴板来勾选事件。

那么,有什么想法吗? 谢谢你。

【问题讨论】:

  • 你的意思是你在任何地方选择了某个文本,然后会弹出一个带有翻译的工具提示?
  • 是的~~看起来像谷歌工具栏

标签: c# text


【解决方案1】:

一个起点是获取对当前前景窗口的引用。下面的代码将获取当前选中的窗口和该窗口的标题:

[ DllImport("user32.dll") ]

static extern int GetForegroundWindow();

[ DllImport("user32.dll") ]
static extern int GetWindowText(int hWnd, StringBuilder text, int count); 

private void GetActiveWindow()
{

const int nChars = 256;
int handle = 0;
StringBuilder Buff = new StringBuilder(nChars);

   handle = GetForegroundWindow();

   if ( GetWindowText(handle, Buff, nChars) > 0 )
   {
   this.captionWindowLabel.Text = Buff.ToString();
   this.IDWindowLabel.Text = handle.ToString();
   }

}

您可以在计时器内运行此代码:即给用户 10 秒的时间来选择一个窗口。

我不确定您将如何在窗口中检索选定的文本,但我会为您研究一下。

【讨论】:

  • 谢谢~这几乎是我想要的。我认为我应该使用热键作为触发器,而不是只将鼠标悬停在单词上。
【解决方案2】:

我认为您需要首先获取程序处于活动状态时激活的任何窗口的句柄。我猜你需要在这里查看 InteropServices 才能做到这一点。

使用 Windows API。

【讨论】:

    【解决方案3】:

    听起来你需要让你的代码拦截任何进程的任何窗口句柄,这是它变得有点复杂的地方,因为你必须确保你确实拥有访问另一个进程的访问权限。

    说到这一点,我认为这不是一个好主意,因为您最终可能会通过在引擎盖下四处寻找有关捕获文本选择事件的 winapi 调用而导致另一个进程崩溃,更不用说您必须确定该过程是否选择了任何文本。我能给出的最佳方向是……一篇关于如何在 CodeProject here 上监视进程的文章,这可能是朝着正确方向迈出的一步,请记住使用的代码用于 .NET 1.0 框架。

    希望这对您的编码有所帮助并祝您好运, 最好的祝福, 汤姆。

    【讨论】:

    • 顺便说一句,我应该提到这一点,请小心,因为您的代码在托管进程中,拦截和戳另一个可能不受管理的进程的方法可能会使体验有点毛骨悚然。 . 保重!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多