2008-08-20 15 views
4

Ist es möglich, UI-Text von einer externen Anwendung in C# zu erhalten?Abrufen von UI-Text von externer App in C#

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

Ich nehme an, es gibt einige Zugänglichkeit API (z. B. für Bildschirmleser gemeint), die dies ermöglicht.

Edit: Derzeit in der Verwendung von etwas wie die Managed Spy App suchen, würde aber noch andere Leads zu schätzen wissen.

Antwort

5

Sie könnten es tun, wenn dieser Unicode-Text tatsächlich ein Fenster mit einer Beschriftung ist, indem Sie eine WM_GETTEXT Nachricht senden.

[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 der Leinwand gemalt ist, können Sie etwas Glück haben, wenn Sie wissen, welchen Rahmen die Anwendung verwendet. Wenn es WinForms oder Borlands VCL verwendet, können Sie dieses Wissen verwenden, um zu dem Text zu gelangen.

+0

Dies funktioniert auch für Standard win32 Etiketten und Schaltflächen. Interop nit: SendMessage sollte IntPtr zurückgeben und IntPtr für wParam nehmen. Ist das im Fall von WM_TEXT nicht wichtig (obwohl falsches wParam ein Problem sein könnte, wenn es als 64bit-Code ausgeführt wird?), Aber es ist eine gute Übung, die richtigen Typen zu verwenden, falls der Code cut & paste erneut verwendet wird. – BrendanMcK

2

nicht sehen die Werte für WM_GETTEXT oder WM_GETTEXTLENGTH in diesem Artikel, so für alle Fälle ..

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

Wenn Sie nur über die Standard-Win32-Label kümmern, dann wird WM_GETTEXT gut funktionieren, wie umrissen in die anderen antworten.

-

Es gibt eine Zugänglichkeit API - UIAutomation - für Standardetiketten, verwendet es zu WM_GETTEXT hinter den Kulissen. Ein Vorteil besteht jedoch darin, dass Text von mehreren anderen Steuerelementen abgerufen werden kann, einschließlich der meisten Systemsteuerelemente, und häufig auch von Benutzeroberflächen, die Steuerelemente außerhalb des Systems verwenden - einschließlich WPF, Text in IE und Firefox und anderen.

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