Я пишу небольшое приложение, которое, помимо прочего, расширяет ярлыки до полного текста при наборе текста.пример: пользователь пишет где-то «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
, вероятно, потому что они используют графику для визуализации элементов, и я не уверен, как я могу добраться до активного элемента и прочитатьэто текст.
В названии вопроса я упоминал только о веб-браузерах, потому что этот инструмент будет в основном использоваться с веб-браузерами.
Заранее благодарен за любые отзывы.