Получение текста пользовательского интерфейса из внешнего приложения в C # - PullRequest
4 голосов
/ 20 августа 2008

Возможно ли получить текст пользовательского интерфейса из внешнего приложения на C #.

В частности, есть ли способ прочитать текст Unicode с метки (я полагаю, это нормальный элемент управления меткой Windows) из внешнего приложения Win32, написанного третьей стороной? Текст видим, но не выбирается мышью в пользовательском интерфейсе.

Я предполагаю, что есть некоторый API-интерфейс для специальных возможностей (например, предназначенный для программ чтения с экрана), который позволяет это.

Редактировать: В настоящее время изучаю возможность использования чего-то вроде Управляемого шпионского приложения , но все равно буду благодарен за любые другие предложения.

Ответы [ 3 ]

5 голосов
/ 15 июня 2012

Если вам нужна стандартная метка Win32, WM_GETTEXT будет работать нормально, как указано в других ответах.

-

Существует API доступности - UIAutomation - для стандартных меток, он также использует 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 );
    }
}
5 голосов
/ 21 августа 2008

Вы можете сделать это, если этот текст в Unicode на самом деле является окном с заголовком, отправив сообщение 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 или VCL Borland, вы можете использовать эти знания, чтобы добраться до текста.

2 голосов
/ 21 августа 2008

не видел значения wm_gettext или wm_gettextlength в этой статье, так что на всякий случай ..

const int WM_GETTEXT = 0x0D;
const int WM_GETTEXTLENGTH = 0x0E;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...