Можно ли получить текст пользовательского интерфейса из внешнего приложения на C#.
В частности, есть ли способ прочитать текст Unicode с метки (я предполагаю, что это обычный элемент управления меткой Windows) из внешнего приложения Win32, написанного сторонней стороной? Текст виден, но не может быть выделен мышью в пользовательском интерфейсе.
Я предполагаю, что есть API специальных возможностей (например, предназначенный для программ чтения с экрана), который позволяет это.
Обновлено: в настоящее время изучается использование чего-то вроде Управляемое шпионское приложение, но все равно буду признателен за любые другие предложения.





Вы можете сделать это, если этот текст в Юникоде на самом деле является окном с заголовком, отправив сообщение WM_GETTEXT.
[DllImport("user32.dll")]
public static extern int SendMessage (IntPtr hWnd, int msg, int Param, System.Text.StringBuilder text);
System.Text.StringBuilder text = new System.Text.StringBuilder(255) ; // or length from call with GETTEXTLENGTH
int RetVal = Win32.SendMessage( hWnd , WM_GETTEXT, text.Capacity, text);
Если он просто нарисован на холсте, вам может повезти, если вы знаете, какой фреймворк использует приложение. Если он использует WinForms или Borland VCL, вы можете использовать эти знания, чтобы добраться до текста.
не видел значений для wm_gettext или wm_gettextlength в этой статье, так что на всякий случай ..
const int WM_GETTEXT = 0x0D;
const int WM_GETTEXTLENGTH = 0x0E;
Если вам просто нужна стандартная метка Win32, тогда WM_GETTEXT будет работать нормально, как указано в других ответах.
-
Существует API доступности - МАУ автоматизация - для стандартных этикеток, он тоже за кулисами использует WM_GETTEXT. Однако одним из его преимуществ является то, что он может получать текст из нескольких других типов элементов управления, включая большинство системных элементов управления, и часто пользовательский интерфейс с использованием несистемных элементов управления, включая WPF, текст в IE и Firefox и другие.
// compile as:
// csc file.cs /r:UIAutomationClient.dll /r:UIAutomationTypes.dll /r:WindowsBase.dll
using System.Windows.Automation;
using System.Windows.Forms;
using System;
class Test
{
public static void Main()
{
// Get element under pointer. You can also get an AutomationElement from a
// HWND handle, or by navigating the UI tree.
System.Drawing.Point pt = Cursor.Position;
AutomationElement el = AutomationElement.FromPoint(new System.Windows.Point(pt.X, pt.Y));
// Prints its name - often the context, but would be corresponding label text for editable controls. Can also get the type of control, location, and other properties.
Console.WriteLine( el.Current.Name );
}
}
Это также работает для стандартных ярлыков и кнопок Win32. Взаимодействие: SendMessage должен возвращать IntPtr и принимать IntPtr вместо wParam. Может не иметь значения в случае WM_TEXT (хотя неправильный wParam может быть проблемой при запуске как 64-битный код?), Но рекомендуется использовать правильные типы в случае, если код будет вырезан и вставлен повторно.