vahidsj2 Ответов: 1

Как я получаю выделенный текст в C#


я хочу написать приложение для windows на языке Си#
когда я выбираю текст или выделяю текст из формы windows сайта (каждый текст в windows,web , ...) , я получаю текст

Что я уже пробовал:

я хо переводчик пустота
я хочу ,чтобы когда я выбираю текст, я получаю текст и перевожу текст
но я не знаю, как получить выделенный текст при выборе текста

[no name]

Это не дает никаких подробностей? Вы выбираете текст откуда?

vahidsj2

каждый текст в windows , web , notpad , word,...

j snooze

ну, если это текстовое поле, где текст выделен, вы можете просто сделать имя текстового поля и использовать свойство SelectedText.

vahidsj2

я хочу сделать эту работу из формы windows

Richard MacCutchan

Если вы хотите захватить текст, который отображается в других окнах на дисплее, то это довольно сложная задача. Вы можете скопировать фактическое изображение с экрана, но оно не будет иметь текстовой формы, поэтому вам нужно будет использовать OCR для его преобразования.

1 Ответов

Рейтинг:
0

Member 8100174

Для этого есть два шага:

1. Вам сфокусированного контроля. Мы можем получить текущее активированное окно через GetForegroundWindow API, а затем вызвать GetWindowThreadProcessId API, чтобы получить идентификатор потока текущего окна. Если это не текущий поток, вызовите API AttachThreadInput, чтобы присоединить поток к текущему потоку. После выполнения всех этих заданий мы можем вызвать GetFocus API, чтобы получить сфокусированный дескриптор управления.

2. Получите текст сфокусированного элемента управления. Для этого мы можем вызвать API SendMessageW, чтобы отправить сообщение WM_GETTEXT.

Вы можете получить подробную информацию из приведенного ниже кода:

частная система.Окна.Формы.Timer _timer = новая система.Окна.Формы.Таймер();

частный недействительными Form2_Load(объект отправителя, EventArgs в электронной)
{
//Инициализируйте таймер для обновления управляющего текста.
_таймер.Интервал = 1000;
_таймер.ТИК += новый EventHandler(_timer_Tick);
}
_timer_Tick недействительным(объект отправителя, EventArgs в электронной)
{
пробовать
{
текстовое поле textbox1.Текст = GetTextFromFocusedControl();
}
catch (исключение exp)
{
текстовое поле textbox1.Текст += ехр.Сообщение;
}
}

//Начните отслеживать и показывать текст соответствующего элемента управления.
частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
_таймер.Начать();
}

//Получить текст сфокусированного элемента управления
частная строка GetTextFromFocusedControl()
{
пробовать
{
int activeWinPtr = GetForegroundWindow().ToInt32();
int activeThreadId = 0, processId;
activeThreadId = GetWindowThreadProcessId(activeWinPtr, out processId);
инт currentThreadId = исполнения();
if (activeThreadId != currentThreadId)
AttachThreadInput(activeThreadId, currentThreadId, true);
IntPtr activeCtrlId = GetFocus();

вернуть то gettext(activeCtrlId);
}
catch (исключение exp)
{
возвращение опыта.Сообщение;
}
}

//Получить текст элемента управления в положении мыши
частная строка GetTextFromControlAtMousePosition()
{
пробовать
{
Точка Р;
if (GetCursorPos(out p))
{
IntPtr ptr = WindowFromPoint(p);
if (ptr != IntPtr.Zero)
{
вернуть то gettext(ПТР);
}
}
вернуть "";
}
catch (исключение exp)
{
возвращение опыта.Сообщение;
}
}

//Получить текст элемента управления с его дескриптором
частная строка GetText(дескриптор IntPtr)
{
int maxLength = 100;
IntPtr buffer = Маршал.AllocHGlobal((maxLength + 1) * 2);
SendMessageW(handle, WM_GETTEXT, maxLength, buffer);
строка w = Маршал.PtrToStringUni(буфер);
Маршал.FreeHGlobal(буфер);
вернуть ж;
}

[DllImport("user32.dll")]
public static extern bool GetCursorPos(out Point pt);

[DllImport("user32.dll", EntryPoint = "WindowFromPoint", CharSet = кодировка.Авто, ExactSpelling = true)]
публичный статический модификатор extern указателя IntPtr WindowFromPoint(Point на ПТ);

[DllImport("user32.dll", EntryPoint = "SendMessageW")]
публичный статический модификатор extern int и SendMessageW системы([атрибуты inattribute].Указателя IntPtr hwnd элемента, МСГ инт, инт параметр wparam, указателя IntPtr lparam должен);
public const int WM_GETTEXT = 13;

[DllImport("user32.dll", CharSet = кодировка.Авто, ExactSpelling = true)]
внутренний статический extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = кодировка.Авто, ExactSpelling = true)]
внутренний статический extern IntPtr GetFocus();

[DllImport("user32.dll", CharSet = кодировка.Auto, SetLastError = true)]
внутренний статический extern int GetWindowThreadProcessId(int handle, out int processId);

[Атрибута DllImport("user32 определяет", кодировка = кодировка.Анси, функции setlasterror = true, то ExactSpelling = true в)]
внутренний статический модификатор extern int с AttachThreadInput(инт idAttach, idAttachTo тип int, bool и fAttach);
[DllImport("kernel32.dll")]
внутренний статический extern int GetCurrentThreadId();

[DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
внутренний статический extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount);
Дайте мне знать, если это не поможет.
Аланд Ли
[^]