Как считать Выделенный/выделенный текст из любого окна с помощью c#.
я попробовал 2 подхода.
таким образом, я переключил свой подход к 2-му методу, отправьте метод сообщения.
см. этот пример кода
[DllImport("user32.dll")]
static extern int GetFocus();
[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);
[DllImport("user32.dll") ]
static extern int GetForegroundWindow();
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam);
// second overload of SendMessage
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);
const int WM_SETTEXT = 12;
const int WM_GETTEXT = 13;
private string PerformCopy()
{
try
{
//Wait 5 seconds to give us a chance to give focus to some edit window,
//notepad for example
System.Threading.Thread.Sleep(5000);
StringBuilder builder = new StringBuilder(500);
int foregroundWindowHandle = GetForegroundWindow();
uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
uint currentThreadId = GetCurrentThreadId();
//AttachTrheadInput is needed so we can get the handle of a focused window in another app
AttachThreadInput(remoteThreadId, currentThreadId, true);
//Get the handle of a focused window
int focused = GetFocus();
//Now detach since we got the focused handle
AttachThreadInput(remoteThreadId, currentThreadId, false);
//Get the text from the active window into the stringbuilder
SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);
return builder.ToString();
}
catch (System.Exception oException)
{
throw oException;
}
}
этот код, хорошо работающий в Блокноте. Но если я пытаюсь получить от другого приложения как Mozilla Firefox или Visual Studio IDE, он не возвращает текст.
Кто-либо может помочь мне, где я делаю неправильно? В первую очередь, я выбрал правильный подход?
Это потому, что и Firefox, и Visual Studio не используют встроенные элементы управления Win32 для отображения / редактирования текста.
В целом невозможно получить значение «любого» выделенного текста из-за того, что программы могут повторно реализовать свою собственную версию элементов управления Win32 любым способом, который они видят. подходят, и ваша программа не может рассчитывать на работу со всеми из них.
Однако вы можете использовать UI Automation API, которые позволят вам взаимодействовать с большинством сторонних элементов управления (по крайней мере, со всеми хорошими, такими как Visual Studio и Firefox - скорее всего, будут работать с API автоматизации пользовательского интерфейса, поскольку это требование доступности)