Ответ 1
Я считаю, что библиотека не является оптимальным способом делать то, что вы хотите. Я бы использовал библиотеку, более подходящую для манипулирования браузером DOM, например Selenium.
Я пишу небольшое приложение, которое, среди прочего, расширяет ярлыки в полный текст при наборе текста. Например: пользователь пишет "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
вероятно, потому, что они используют графику для визуализации элементов, и я не уверен, как я могу перейти к активному элементу и прочитать его текст.
Я только упоминал веб-браузеры в заголовке вопроса, потому что этот инструмент будет в основном использоваться с веб-браузерами.
заблаговременно за любую обратную связь.
Я считаю, что библиотека не является оптимальным способом делать то, что вы хотите. Я бы использовал библиотеку, более подходящую для манипулирования браузером DOM, например Selenium.
Я лично попытаюсь создать библиотеку, которую предпочитает хром. Есть много доступных, таких как Kantu, который специализируется на Chrome.
Примеры: TestCafe, Watir, SlimerJS