Feedback

C# - Maus kontrollieren

Veröffentlicht von am 18.01.2007
(5 Bewertungen)
Diese Klasse 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));
        }
    }
}

Abgelegt unter maus, bewegen, klicken, cursor.

5 Kommentare zum Snippet

Jan Welker schrieb am 23.01.2007:
Super, ich konnte die Klasse schon gut gebrauchen.
Alexander Theißen schrieb am 25.01.2007:
Leider funktioniert die Klasse nicht mehr unter Windows Vista. Ich vermute es liegt an der UAC, die nicht zulässt, dass ein Programm in anderen Prozessen rumklickt. Auch starten des Programms mit Admin Previlegien, dass diese Klasse verwendet bringt nichts. Bisher habe ich keine Lösung gefunden. Für Hilfe wäre ich sehr dankbar, da auch ein Programm von mir betroffen ist.
Alexander Theißen schrieb am 05.02.2007:
Habe die Klasse geupdatet. Läuft jetzt auch unter Vista.
Jan Welker schrieb am 07.02.2007:
Super!
Oliver schrieb am 25.01.2008:
Kann jemand die Klasse in C++ umschreiben?
Wollte es erst selbst machen, bin aber nicht ganz durch den Code gestiegen, da ich C# nicht so gut kann. Ich brauche den Code für ein Programm in C++.
Wäre echt nett, wenn sich jemand die Mühe macht.
Bitte...
 

Logge dich ein, um hier zu kommentieren!