Получить текст изнутри google chrome с помощью моего приложения С#

Я пишу небольшое приложение, которое, среди прочего, расширяет ярлыки в полный текст при наборе текста. Например: пользователь пишет "BNN" где-то и нажимает соответствующую комбинацию клавиш, приложение заменит "BNN" на "Привет, я банан".

после некоторых исследований я узнал, что это можно сделать с помощью 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 или название вкладки в хром.

если я запустил приложение на этой странице при вводе этого вопроса, например, вместо содержимого вопроса, текст, который я получаю:

Получить текст изнутри google chrome с помощью моего приложения С# - переполнение стека - Google

вероятно, потому, что они используют графику для визуализации элементов, и я не уверен, как я могу перейти к активному элементу и прочитать его текст.

Я только упоминал веб-браузеры в заголовке вопроса, потому что этот инструмент будет в основном использоваться с веб-браузерами.

заблаговременно за любую обратную связь.

Ответы

Ответ 1

Я считаю, что библиотека не является оптимальным способом делать то, что вы хотите. Я бы использовал библиотеку, более подходящую для манипулирования браузером DOM, например Selenium.

Ответ 2

Я лично попытаюсь создать библиотеку, которую предпочитает хром. Есть много доступных, таких как Kantu, который специализируется на Chrome.

Примеры: TestCafe, Watir, SlimerJS