Получить текст из Google Chrome с помощью моего приложения C # - PullRequest
0 голосов
/ 24 апреля 2018

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

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

1) получить дескриптор активного окна2) получить дескриптор активного окна3) прикрепить вход к активной теме4) получить сфокусированную ручку управления (+ позиция каретки, но это не проблема)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 Forms, но не работает ни с WPF, ни с браузерами, просто дает мне название приложения WPF илизаголовок вкладки в chrome.

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

Получить текст из Google Chrome, используя мое приложение на c # - Переполнение стека - Google

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

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

Заранее благодарен за любые отзывы.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

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

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

0 голосов
/ 08 июня 2018

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

...