Laden...

Wie gehe ich mein Thema an? (Bildschirm analysieren und z.B. Maus steuern)

Erstellt von DaNeubi vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.509 Views
DaNeubi Themenstarter:in
8 Beiträge seit 2016
vor 5 Jahren
Wie gehe ich mein Thema an? (Bildschirm analysieren und z.B. Maus steuern)

Hallo Community,

leider bin ich nicht so firm mit C# wie ich es gerne wäre. Daher weiß ich aktuell leider nicht wie ich ein "kleines" Projekt angehen soll.

Ich möchte, dass der Desktop analysiert wird und wenn z.B. ein Button mit dem Namen "Klick ME" o.ä. gefunden wird, die Maus sich dann auf diesen bewegt und ihn dann klickt.
Mein größtes Problem hierbei ist, wie kann ich den Desktop auf diese Weise "Analysieren"?

Vielen Dank im vorraus.

Grüße
DaNeubi

Wenn du Rechtschreibfehler findest, darfst du die gerne behalten 😉

5.657 Beiträge seit 2006
vor 5 Jahren

Hi DaNeubi,

du mußt den Inhalt des Bildschirms analysieren. Der ist aber im Grunde nur eine Anzahl von Pixeln mit einer bestimmten Farbe. Die Elemente wie Buttons oder Text werden von der jeweiligen Anwendung (Browser, Office, etc.) gerendert und das Ergebnis auf den Bildschirm kopiert. Für Anwendungen, die in WPF erstellt wurden, kannst du zwar UIAutomation zu verwenden, aber in allen anderen Fällen müßtest du Screenshots machen und diese z.B. per OCR analysieren.

Die eigentliche Frage ist, warum man sich ausgerechnet als Neueinsteiger mit einem so ungewöhnlichen Problem beschäftigen sollte.

Weeks of programming can save you hours of planning

C
2.121 Beiträge seit 2010
vor 5 Jahren

Gehts drum einen Button am Namen zu erkennen oder am Inhalt? Man kann irgendwie Controls durchsuchen, mit APIs. Es gibt Programme die das können, hab aber grad kein Beispiel parat.

78 Beiträge seit 2016
vor 5 Jahren

Eine Möglichkeit wäre mit EnumChildWindows zu arbeiten.
Siehe dazu:
https://msdn.microsoft.com/de-de/library/windows/desktop/ms633494(v=vs.85).aspx


        [DllImport("user32.Dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumChildWindows(IntPtr parentHandle, Win32Callback callback, IntPtr lParam);


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

Und über SetWinEventHook neue Fenster zu detektieren:


        [DllImport("user32.dll")]
        static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr
           hmodWinEventProc, IntPtr lpfnWinEventProc, uint idProcess,
           uint idThread, uint dwFlags);

        [DllImport("user32.dll")]
        static extern bool UnhookWinEvent(IntPtr hWinEventHook);

http://dotnet-paderborn.azurewebsites.net/