Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1839 | Besucher online: 110
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Maus kontrollieren


Autor: Alexander Theißen
Sprache: C#
Bewertung:
8.43 (5 votes)
Anzahl der Aufrufe: 15980
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: maus, bewegen, klicken, cursor.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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));
        }
    }
}

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Jan Welker schrieb am:  23.01.2007 21:25:02

Super, ich konnte die Klasse schon gut gebrauchen.
Alexander Theißen schrieb am:  25.01.2007 22:05:09

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 23:17:09

Habe die Klasse geupdatet. Läuft jetzt auch unter Vista.
Jan Welker schrieb am:  07.02.2007 00:37:07

Super!
Oliver schrieb am:  25.01.2008 17:52:11

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...


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.