C# Programm soll Mauszeiger an bestimmter Stelle klicken lassen

M4deman

Lt. Commander
Registriert
März 2012
Beiträge
1.364
Hi, ich habe ein Programm geschrieben, dass mehrere Linksklicks ausführen soll.
Soweit wie ich es bisher hab, klickt es andauernd an der Stelle, wo man die Maus hinbewegt.
Man kann über den Global Hotkey "Q" zu jeder Zeit (also auch bei inaktivem Fenster) das Klicken an/abschalten.

Ich möchte aber, dass es sobald ich Q drücke die Stelle merkt an der der Zeiger war und immer dort klickt. Meiner Meinung nach hab ich das auch so gecodet aber es funktioniert weiter wie bisher. (Also klickt immer da, wo man die Maus hinbewegt)
Könnte da mal jemand drüber schauen bitte?

Programm ist im Anhang zu finden und hier mal die mMn relevanten Teile des Codes:
(Die Hotkey Klasse [siehe Anhang] hab ich mir lediglich aus dem Netz gezogen, ist aber mMn nicht relevant)

Code:
 public partial class Form1 : Form
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
        private const int MOUSEEVENTF_LEFTDOWN = 0x02;
        private const int MOUSEEVENTF_LEFTUP = 0x04;
        private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
        private const int MOUSEEVENTF_RIGHTUP = 0x10;
        globalKeyboardHook hook;
        int X, Y, i=0,j=2;
        uint A, B;

        public Form1()
        {
            InitializeComponent();
            hook = new globalKeyboardHook();
            hook.HookedKeys.Add(Keys.Q);
            hook.KeyDown += new KeyEventHandler(hook_KeyDown);
            hook.KeyUp += new KeyEventHandler(hook_KeyUp);
            hook.hook();
        }

        void hook_KeyUp(object sender, KeyEventArgs e)
        {
            if (j % 2 == 0)
            {
                X = Cursor.Position.X;
                Y = Cursor.Position.Y;
                A = Convert.ToUInt32(X);
                B = Convert.ToUInt32(Y);
                timer2.Start();
            }
            else
            {
                timer2.Stop();
            }
            e.Handled = true;
            j++;
        }

        public void DoMouseClick()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, A, B, 0, 0);
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            DoMouseClick();
        }

Anhang anzeigen clicker.zip
 
Code:
            Cursor.Position = new System.Drawing.Point((int)A, (int)B);
            mouse_event(MOUSEEVENTF_LEFTDOWN, A, B, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, A, B, 0, 0);

Alternativ könnte man die Maus mit:
Code:
        private const int MOUSEEVENTF_MOVE = 0x0001;
        private const int MOUSEEVENTF_ABSOLUTE = 0x8000;

        mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, 20000, 20000, 0, 0);
bewegen. Aber mouse_event braucht wohl ganz andere Werte als die Werte die Cursor.Position liefert.....
 
Zuletzt bearbeitet von einem Moderator:
Na ja, mouse_event gut Dokumentiert im MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx
Die Werte für die absoluten Koordinaten sind zwischen 0 und 65536 für den Hauptbildschirm. Also nur noch dessen Größe rausfinden und man kann die Einheiten umrechnen. (Z.B. über SystemInformation.PrimaryMonitorSize)
Aber wie die MSDN schon sagt: Besser SendInput verwenden, auch wenn es komplizierter ist (von managed aus).
 
Die Cursor.Position hat schon zum gewünschten Ergebnis geführt, danke :)
Ich dachte eigentlich durch das A und B im Event in der DoMouseClick Methode hätte ich die Koordinaten, wo er klicken soll schon.
 
Zurück
Oben