Laden...

Mauszeiger kontrollieren (Move, Click)

Erstellt von AlphaWolf vor 16 Jahren Letzter Beitrag vor 16 Jahren 11.886 Views
A
AlphaWolf Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren
Mauszeiger kontrollieren (Move, Click)

Beschreibung:

Diese Klasse von mir ermöglicht per P / I die Maus zu kontrollieren. Tastatur Eingaben wären mit ein paar kleinen Erweiterungen zwar auch möglich aber dafür existiert bereits eine verwaltete Klasse: http://msdn2.microsoft.com/de-de/library/system.windows.forms.sendkeys(VS.80).aspx

Ich habe die beiden rudimentären Methoden zum Bewegen und Linksklicken eingebaut. Weitere können jedoch leicht selbst eingebaut werden. Die Klasse ist recht selbsterklärend.
Eine kleine Erinnerung:
Wenn bei den beiden Methoden ein Fehler auftreten sollte kann der letzte Fehlercode mit System.Runtime.InteropServices.Marshal.GetLastWin32Error() abgerufen werden.


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;


namespace Program
{
    public class Win32Input
    {
        [DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
        static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

        [DllImport("user32.dll", EntryPoint = "GetMessageExtraInfo", SetLastError = true)]
        static extern IntPtr GetMessageExtraInfo();

        private enum InputType
        {
            INPUT_MOUSE = 0,
            INPUT_KEYBOARD = 1,
            INPUT_HARDWARE = 2,
        }

        [Flags()]
        private enum MOUSEEVENTF
        {
            MOVE = 0x0001,  // mouse move 
            LEFTDOWN = 0x0002,  // left button down
            LEFTUP = 0x0004,  // left button up
            RIGHTDOWN = 0x0008,  // right button down
            RIGHTUP = 0x0010,  // right button up
            MIDDLEDOWN = 0x0020,  // middle button down
            MIDDLEUP = 0x0040,  // middle button up
            XDOWN = 0x0080,  // x button down 
            XUP = 0x0100,  // x button down
            WHEEL = 0x0800,  // wheel button rolled
            VIRTUALDESK = 0x4000,  // map to entire virtual desktop
            ABSOLUTE = 0x8000,  // absolute move
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public MOUSEEVENTF dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct INPUT
        {
            public InputType type;
            public MOUSEINPUT mi;
        }
        /// <summary>
        /// Diese Funktion bewegt den Mauscursor an einen bestimmten Punkt.
        /// </summary>
        /// <param name="x">X Koordinate der Position als absoluter Pixelwert</param>
        /// <param name="y">Y Koordinate der Position als absoluter Pixelwert</param>
        /// <returns>Liefert 1 bei Erfolg und 0, wenn der Eingabestream schon blockiert war zurück.</returns>
        public static uint Move(int x, int y)
        {
            // Bildschirm Auflösung
            float ScreenWidth = Screen.PrimaryScreen.Bounds.Width;
            float ScreenHeight = Screen.PrimaryScreen.Bounds.Height;

            INPUT input_move = new INPUT();
            input_move.type = InputType.INPUT_MOUSE;

            input_move.mi.dx = (int)Math.Round(x * (65535 / ScreenWidth), 0);
            input_move.mi.dy = (int)Math.Round(y * (65535 / ScreenHeight), 0);
            input_move.mi.mouseData = 0;
            input_move.mi.dwFlags = (MOUSEEVENTF.MOVE | MOUSEEVENTF.ABSOLUTE);
            input_move.mi.time = 0;
            input_move.mi.dwExtraInfo = GetMessageExtraInfo();

            INPUT[] input = { input_move };
            return SendInput(1, input, Marshal.SizeOf(input_move));
        }

        /// <summary>
        /// Diese Funktion simuliert einen einfach Mausklick mit der linken Maustaste an der aktuellen Cursurposition.
        /// </summary>
        /// <returns>Liefert 2 zurück, wenn beide Aktionen (Maus down und Maus up) erfolgreich waren. Andernfalls 1 oder 0.</returns>
        public static uint Click()
        {
            INPUT input_down = new INPUT();
            input_down.type = InputType.INPUT_MOUSE;

            input_down.mi.dx = 0;
            input_down.mi.dy = 0;
            input_down.mi.mouseData = 0;
            input_down.mi.dwFlags = MOUSEEVENTF.LEFTDOWN;
            input_down.mi.time = 0;
            input_down.mi.dwExtraInfo = GetMessageExtraInfo();

            INPUT input_up = input_down;
            input_up.mi.dwFlags = MOUSEEVENTF.LEFTUP;

            INPUT[] input = { input_down, input_up };
            return SendInput(2, input, Marshal.SizeOf(input_down));
        }
    }
}

142 Beiträge seit 2007
vor 16 Jahren

HI,

gibt es irgendeinen Vorteil wenn ich jetzt den Cursor mit der Klasse bewegen würde anstatt mit

Cursor.Position = new Point(X, Y);

??

MFG

G
58 Beiträge seit 2007
vor 16 Jahren

Kann man mit Cursor.?? klicken? 😉

142 Beiträge seit 2007
vor 16 Jahren

Hallo,
ich hoffe du meinst das net als Vorteil weil ich hab die Frage extra mit "bewegen" anstatt "steuern" oder "kontrollieren" xD Das Klicken is dabei nicht gemeint ^^

MFG

A
AlphaWolf Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

Wusste ich nicht, dass es das gibt. Ich habe alles abgeklappert aber nichts gefunden, weil ich das für ein Projekt brauchte. Also habe ich das mit P/I gemacht. Klicken brauchte ich sowieso also hat es immer noch seinen Sinn.

Gelöschter Account
vor 16 Jahren

würde es nicht reichen wenn man GetChildAtPoint(Point) verwendet? (geht natürlich nur innerhalb der eigenen GUI)

wenn man dann den child hat kann man auch einen klick auslösen usw....

ps: im allgemeinen finde ich deine lösung auch recht interessant.