Сведения о вопросе

Pytdev

02:05, 19th August, 2020

Теги

c#   winapi   interop    

Получение UI текста из внешнего приложения в C#

Просмотров: 529   Ответов: 3

Можно ли получить UI текст из внешнего приложения в C#.

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

Я предполагаю, что существует некоторая доступность API (например, предназначенная для чтения с экрана), которая позволяет это сделать.

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



  Сведения об ответе

SEEYOU

00:52, 20th August, 2020

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


  Сведения об ответе

fo_I_K

21:06, 1st October, 2020

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

Есть специальные возможности API - UIAutomation -для стандартных меток, он тоже использует WM_GETTEXT за кулисами. Однако одно из его преимуществ заключается в том, что он может получать текст из нескольких других типов элементов управления, включая большинство системных элементов управления, и часто UI использует несистемные элементы управления, включая 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 );
    }
}


  Сведения об ответе

VCe znayu

19:50, 24th August, 2020

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

const int WM_GETTEXT = 0x0D;
const int WM_GETTEXTLENGTH = 0x0E;


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться