Text Propertie aus einem window auslesen?

30/10/2008 - 11:41 von Volkan Senguel | Report spam
Hallo zusammen, wir haben hier eine App (2003, gekauft, Closed Source) aus
welcher wir teils Inhalte in unsere eigenen Tools > SoftPhone > CRM etc.
übertragen müssen.
Bis anhin wurden die Infos abgeschrieben da mann in diesem Programm nichts
markieren und kopieren kann (!!!)... sehr zeitaufwàndig.

Mittels Winspector habe ich jetzt rausgefunden dass es sich da um "normale"
Textboxen und Richtextfelder handelt wo die Infos drin stehen.
Mit Winspector sehe ich auch im Propertie "Text" den Wert wo wir benötigen.


Nun hier meine Frage kann mann mit C# ein Fenster (z.B.) mit der Maus links
+ Control anklicken wo dann dieser dass Control ermittelt und den Text Wert
ausliest?
Im Prinzip so wie wenn man mit Winspector den Fadenkreuz auf das
Programm/Control zieht.

Könnte natürlich auch ein Fadenkreuz sein... hauptsache man kann das
Propertie vom window auslesen.

Kennt da jeman etwas?

Danke für jeden Tip ;)
Volkan Senguel
 

Lesen sie die antworten

#1 Kerem Gümrükcü
30/10/2008 - 12:20 | Warnen spam
Hallo Volkan,

Kennt da jeman etwas?



mit reinen Windows .NET Bortmiteln wird das etwas schwer.
Ein Ansatz ist mit ein paar funktionen der Windows API:
Du brauchst ne Textbox und einen Timer auf deiner form.
Stell den Timer mal auf 500:


using System.Runtime.InteropServices;

...

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;

public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}

public static implicit operator System.Drawing.Point(POINT p)
{
return new System.Drawing.Point(p.X, p.Y);
}

public static implicit operator POINT(System.Drawing.Point p)
{
return new POINT(p.X, p.Y);
}
}

[DllImport("user32.dll", SetLastError = true, CharSet =
CharSet.Auto)]
static extern int GetWindowTextLength(IntPtr hWnd);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError =
true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString,
int nMaxCount);

[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(POINT Point);

[DllImport("user32.dll")]
static extern bool GetCursorPos(out Point lpPoint);

public Form1()
{
InitializeComponent();
}
public string GetWndText(IntPtr hWnd)
{
try
{
int Length = GetWindowTextLength(hWnd);
StringBuilder sb = new StringBuilder(Length + 1);
GetWindowText(hWnd, sb, sb.Capacity);
return sb.ToString();
}
catch (Exception err)
{
return err.Message;
}
}


private void Form1_Load(object sender, EventArgs e)
{

}

private void timer1_Tick(object sender, EventArgs e)
{
try
{
Point p;
GetCursorPos(out p);
IntPtr hwnd = WindowFromPoint(new POINT(p.X, p.Y));
this.textBox1.Text = GetWndText(hwnd);
}
catch (Exception)
{

}
}

Man könnte zwar z.b. mit global hooks arbeiten um den timer zu
umgehen, auch andere Methoden aber das ist ein erster Ansatz für dich,...

Grüße

Kerem


Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.codeplex.com/restarts
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

Ähnliche fragen