C# Applikation verhindert Copy & Paste - Wie umgehen

  • Ersteller Ersteller Green Mamba
  • Erstellt am Erstellt am
G

Green Mamba

Gast
Hallo,

ich habe hier eine vermutlich sehr alte Anwendung, die verhindert das Auslesen bestimmter Textfelder mit der STRG-C. Man kann den entsprechenden Text noch nicht mal mit der Maus oder dem Cursor markieren. Allerdings muss ich dieses Textfeld programmatisch mit einer eigenen .NET-Applikation auslesen und scheitere daran aktuell.
Hat jemand mal ein ähnliches Problem gehabt oder eine Idee zur Lösung? OCR habe ich bereits versucht mit Tesseract, funktioniert aber leider trotz der sauberen Schriftart nicht zuverlässig. An die Entwickler des Programms komme man auch nicht mehr, die sind sicherlich schon im verdienten Ruhestand. Gibt es einen Trick auf den ich nicht komme?

Viele Grüße,
Mamba
 
Hades85 schrieb:
Die Anwendung eines Hexeditors zu umständlich bzw. zu mühselig?

Die Anwendung wird vermutlich Informationen zur Laufzeit generieren, da kommst du mit einem Hex-Editor nicht weit. Hier müsste man den Text wohl eher aus dem Speicher auslesen. Aber jedes Mal variable Offsets suchen, ist wohl aufwendiger, als direkt String-Output einfach abzutippen.

Ich fürchte, eine einfache Lösung wird es hier nicht geben, da die Informationen wahrscheinlich nicht dafür vorgesehen waren, markierbar zu sein. Sind die Sourcen evtl. noch vorhanden?
 
Zuletzt bearbeitet:
Würde auch den Weg über Windows API gehen. In etwa so:

Code:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace GetText
{
    internal class Program
    {
        [DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(int x, int y);

        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        private static void Main(string[] args)
        {
            Process.Start(@"C:\zielprogramm.exe");

            Thread.Sleep(5000);
            IntPtr hWnd = WindowFromPoint(Cursor.Position.X, Cursor.Position.Y);

            var stringBuilder = new StringBuilder();
            GetWindowText(hWnd, stringBuilder, 1024);

            Console.WriteLine(stringBuilder);
            Console.ReadKey();
        }
    }
}

Um Zugriff auf das andere Programm zu haben wird es aus dem Ausleseprogramm gestartet, dann wird nach fünf Sekunden das Handle des Controls unter dem Mauscursor herausgefunden und schließlich dessen Text ausgegeben. Funktioniert bei mir für manches, vielleicht hast du ja Glück. (Das Mauscursor-Zeug kann natürlich durch andere Koordinated ersetzt werden)
 
inciter schrieb:
Die Anwendung wird vermutlich Informationen zur Laufzeit generieren, da kommst du mit einem Hex-Editor nicht weit. Hier müsste man den Text wohl eher aus dem Speicher auslesen. Aber jedes Mal variable Offsets suchen, ist wohl aufwendiger, als direkt String-Output einfach abzutippen.

Ich fürchte, eine einfache Lösung wird es hier nicht geben, da die Informationen wahrscheinlich nicht dafür vorgesehen waren, markierbar zu sein. Sind die Sourcen evtl. noch vorhanden?

Mein Post liest sich etwas vorwurfsvoll, sollte es aber nicht :-)
 
Ich würde auch den Ansatz von Backslash verfolgen:

  • Infos über die Textfelder bekommst du z.B. mit Spy++ (kommt mit Visual Studio) oder dem Window Finder vom sysinternals Process Explorer.

  • In deinem Code könntest du dann per EnumChildWindows durch die Fenster/Controls iterieren und versuchen die für dich relevanten Fenster/Controls rauszufiltern.

  • Mit GetWindowText kommst du dann hoffentlich an den Inhalt der Textbox.
 
Hi,

danke schonmal für die Ideen. :)

- Hex-Editor -> Was sollte ich damit machen? Kannst du das ggf. genauer erläutern? Ich kann damit ja nicht einfach den Speicher der Anwendung auslesen.
- GetWindowText -> Das ist ja die gleiche Methode die auch von Spy++ und Co. verwendet werden. Habe ich auch ausprobiert, Spy++ bzw. AutoIt Window Info erkennt das komplette Innenleben der UI nicht. Die Oberfläche hat mehrere Textfelder, keins davon wird von diesen Programmen erkannt. Wirklich strange...

Ich habe eine Drucken-Funktion entdeckt. Ich habe dazu einen Generic/Text Only Drucker installiert und kann so in ein File drucken welches im Ergebnis die Inhalte aller Textfelder enthält. So kann ich die Informationen automatisiert weiter verarbeiten. Allerdings ist das natürlich sehr sehr umständlich. Sollte also noch jemand eine andere Idee haben, bitte immer her damit.

​Viele Grüße
 
2 Ideen hätte ich noch:

1. Du könntest dich per AttachThreadInput an die Message-Queue der anderen Anwendung hängen und dann nach bestimmten Window Messages Ausschau halten (z.B. WM_SETTEXT)

2. Falls es dir möglich die andere Anwendung (automatisiert) dazu zu bringen einen bestimmten Text (ein Muster nach dem man suchen kann) in die Textboxen zu schreiben, dann könntest du den Speicher der Anwendung nach dem Text durchsuchen, dir die Speicheradresse merken und dann den gewünschten Text (sobald er sich ändert) direkt aus dem Speicher auslesen. (--> C# How to Scan a Process' Memory).
Evtl. erstmal mit nem Debugger prüfen, in welcher Form der Text im Speicher vorliegt.
 
Green Mamba schrieb:
Hi,

danke schonmal für die Ideen. :)

- Hex-Editor -> Was sollte ich damit machen? Kannst du das ggf. genauer erläutern? Ich kann damit ja nicht einfach den Speicher der Anwendung auslesen.

Ich bin nicht sicher inwiefern die Informationen die du brauchst im Ram abgelegt werden, aber http://mh-nexus.de/de/hxd/ ein Hex-Editor könnte man doch benutzen, aber das erfordert viel Geduld und ein wenig Ahnung von HexCode.

Aber vielleicht kann ein anderer mehr ins Detail gehen, ich habe das früher für ganz simple Sachen benutzt um mich oberflächig mit dem Thema zu befassen.
 
Zurück
Oben