使用我的 c# 应用程序从谷歌浏览器中获取文本

Posted

技术标签:

【中文标题】使用我的 c# 应用程序从谷歌浏览器中获取文本【英文标题】:Get text from inside google chrome using my c# app 【发布时间】:2018-10-04 18:55:41 【问题描述】:

我正在编写一个小应用程序,它可以在键入时将快捷方式扩展为全文。 例子: 用户在某处写“BNN”并按下相关的键盘组合,应用程序会将“BNN”替换为“Hi I am Banana”。

经过一番研究,我了解到可以使用user32.dll 完成此任务,完成此任务的过程如下:

1) 获取活动窗口句柄 2) 获取活动窗口线程句柄 3) 将输入附加到活动线程 4) 获得焦点控制句柄(+caret 位置,但这不是问题) 5) 从活动线程中分离输入 6) 使用其句柄从焦点控件中获取文本

到目前为止,这是我的代码:

try

    IntPtr activeWindowHandle = GetForegroundWindow();
    IntPtr activeWindowThread = GetWindowThreadProcessId(activeWindowHandle, IntPtr.Zero);
    IntPtr thisWindowThread = GetWindowThreadProcessId(this.Handle, IntPtr.Zero);
    AttachThreadInput(activeWindowThread, thisWindowThread, true);
    IntPtr focusedControlHandle = GetFocus();

    AttachThreadInput(activeWindowThread, thisWindowThread, false);
    if (focusedControlHandle != IntPtr.Zero)
    
        TB_Output.Text += focusedControlHandle + " , " + GetText(focusedControlHandle) + Environment.NewLine;
    

catch (Exception exp)

    MessageBox.Show(exp.Message);


//...
//...

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowThreadProcessId(int handle, out int processId);

[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
internal static extern int AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, bool fAttach);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
internal static extern IntPtr GetFocus();

这适用于某些 Windows 窗体应用程序,但它不适用于 WPF 或浏览器,只是给了我 WPF 应用程序的标题或 chrome 中选项卡的标题。

例如,如果我在输入此问题时在此页面上运行应用程序,而不是问题的内容,我得到的文本是:

使用我的 c# 应用从谷歌浏览器内部获取文本 - 堆栈内存溢出 - Google

可能是因为他们使用图形来渲染元素,而我不确定如何到达活动元素并阅读它的文本。

我只在问题标题中提到了网络浏览器,因为这个工具将主要用于网络浏览器。

提前感谢您的任何反馈。

【问题讨论】:

不确定这是否是最好的方法,我会去developer.chrome.com/extensions/devguide 这是可行的恕我直言,但连接到网络浏览器可能会触发像地狱一样的 AV 软件。 @bradbury9 我考虑过做一个扩展,但它会导致太多问题,主要是这个工具将主要与 chrome 一起使用,但不仅仅是,所以我不能将它限制为 chrome 扩展。或任何其他浏览器扩展。 +如果我将它安装到我的整个公司,它更容易作为应用程序进行维护和更新...... @bradbury9 在我们过度保护的防病毒软件中安排一个例外不是问题。 如果您想在 Web 浏览器和 WPF 应用程序中执行此操作,您将必须创建一个持续监控键盘并替换模拟键盘输入的文本的键盘记录器。 WPF 控件没有 Windows 句柄,因此 WinAPI 对它们毫无用处。 Web 浏览器中呈现的控件也是如此。 @dymanoid 感谢您的输入,从技术上讲,我的应用程序已经是一个键盘记录器,因为它监视触发扩展的键组合。不幸的是,我知道浏览器和 WTF 窗口控件没有句柄(因为它们在技术上是图形对象),但也许有一种创造性的方式来实现这一点?拼写检查器确实设法做到了,为什么我们不能呢? 【参考方案1】:

我个人会尝试创建一个 chrome 喜欢的库。有很多可用的,例如专门用于 Chrome 的 Kantu。

示例:TestCafe、Watir、SlimerJS

【讨论】:

【参考方案2】:

我认为图书馆不是做你想做的事的最佳方式。我会使用更适合浏览器 DOM 操作的库,例如 Selenium。

【讨论】:

以上是关于使用我的 c# 应用程序从谷歌浏览器中获取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌 api 令牌中获取数据?

如何使用 JS Regex 从谷歌查询链接获取查询值? (Chrome 扩展)

Flutter从谷歌地图获取坐标

如何从谷歌表格中获取评论

如何从谷歌文本到 PHP 中的语音 API 中的 URL 参数获取性别声音?

我应该如何使用 html 代码从谷歌表中获取数据