4 Stimmen

Abrufen von UI-Text aus einer externen Anwendung in C#

Ist es möglich, UI Text aus einer externen Anwendung in C# zu erhalten.

Insbesondere gibt es eine Möglichkeit, Unicode-Text aus einem Etikett (ich nehme an, es ist ein normales Windows-Etikett-Steuerelement) von einer externen Win32-Anwendung zu lesen, die von einem Drittanbieter geschrieben wurde? Der Text ist sichtbar, aber nicht mit der Maus in der Benutzeroberfläche auswählbar.

Ich gehe davon aus, dass es eine API für Barrierefreiheit gibt (z. B. für Bildschirmleser), die dies ermöglicht.

Edit: Derzeit wird die Verwendung von etwas wie dem Verwaltete Spionage-App wäre aber trotzdem für weitere Hinweise dankbar.

6voto

BrendanMcK Punkte 13872

Wenn Sie sich nur für das Standard-Win32-Label interessieren, dann WM_GETTEXT funktioniert gut, wie in den anderen Antworten beschrieben.

--

Es gibt eine Zugänglichkeits-API - UIAutomation - für Standard-Etiketten, verwendet auch sie WM_GETTEXT im Hintergrund. Ein Vorteil ist jedoch, dass es Text von mehreren anderen Arten von Steuerelementen, einschließlich der meisten System-Steuerelemente und oft UI mit Nicht-System-Steuerelemente - einschließlich WPF, Text in IE und Firefox und andere erhalten kann.

// 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 );
    }
}

5voto

Lars Truijens Punkte 41774

Wenn der Unicode-Text tatsächlich ein Fenster mit einer Beschriftung ist, können Sie das tun, indem Sie eine WM_GETTEXT Nachricht.

[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);

Wenn es nur auf die Leinwand gemalt wird, haben Sie vielleicht etwas Glück, wenn Sie wissen, welches Framework die Anwendung verwendet. Wenn sie WinForms oder Borlands VCL verwendet, können Sie dieses Wissen nutzen, um an den Text zu gelangen.

2voto

sieben Punkte 2091

Ich habe die Werte für wm_gettext oder wm_gettextlength in diesem Artikel nicht gesehen, also nur für den Fall

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X