Avatar billede keet Nybegynder
01. august 2005 - 20:33 Der er 12 kommentarer og
1 løsning

flyt mus og klik

Jeg er ved at lave et program der skal kunne flytte musen til (x,y) og så klik på det punkt. Det skal bruges til noget simulering af en bruger og jeg vil gerne have det så generel som muligt.

Dvs. jeg ikke nødvendigvis ved om det er en applet eller flash eller noget andet der klikkes på.

Men kan det overhovedet lade sig gøre med c# og hvordan?
Kræver det evt. meget ekstra software og hvad?
Avatar billede driis Nybegynder
01. august 2005 - 20:35 #1
Ja, det er i hvert fald ikke flash ;-)

Du kan kalde ind i Windows API og bruge SendInput metoden.
Avatar billede keet Nybegynder
01. august 2005 - 20:40 #2
mener du at det ikke kan lade sig gøre i flash?
Avatar billede keet Nybegynder
01. august 2005 - 20:48 #3
Kan man ikke få Windows til at sende et signal til muse-controllen?
Avatar billede keet Nybegynder
01. august 2005 - 21:02 #5
Det var heller ikke det jeg mente :)
Jeg mente blot om det kunne lade sig gøre ligegyldigt om man klikke på en flash ting eller applet. Altså uden at kende noget til de vinduer der er åbnet.

Jeg ser lige på link.. :)
Avatar billede keet Nybegynder
01. august 2005 - 21:08 #6
Har du evt. noget kode jeg kan se?
Fx noget kode der automatisk doblet-klikker på position 10,20
Avatar billede keet Nybegynder
01. august 2005 - 21:17 #7
Jeg har måske fundet noget jeg kan bruge:
http://www.codeguru.com/forum/showthread.php?s=&threadid=227102

Er det noget i den stil jeg skal have fat i?
Avatar billede nielle Nybegynder
01. august 2005 - 21:17 #8
Her er noget VB.NET kode, men måske kan du selv finde ud af at oversætte?
Avatar billede driis Nybegynder
01. august 2005 - 21:50 #9
Eksempel: Her er et konsol program der tager 2 tal som input og dobbelt-klikker på den indtastede koordinat.   

class Class1
    {       
        [STAThread]
        static void Main(string[] args)
        {
            MouseApi api = new MouseApi();
            Console.WriteLine(api.CursorPosition.ToString());
            Console.Write("X ? ");
            string strX = Console.ReadLine();
            Console.Write("Y ? ");
            string strY = Console.ReadLine();
            try
            {
                Point pt = new Point(Convert.ToInt32(strX),Convert.ToInt32(strY));
                api.MoveCursor(pt);
                api.DoubleClick(10);
            }
            catch(Exception ex)
            {
                Console.WriteLine("\nFejl:\n" + ex.Message);
            }
        }
    }


public class MouseApi
    {
        public MouseApi()
        {       
        }

        public Point CursorPosition
        {
            get
            {
                Point p = Point.Empty;
                GetCursorPos(out p);
                return p;
            }
        }

        public void Click()
        {
            MOUSEINPUT minput = new MOUSEINPUT();
            minput.dwFlags = MOUSEEVENTF.LEFTDOWN;
            SendMouseInput(minput);
            minput.dwFlags = MOUSEEVENTF.LEFTUP;
            SendMouseInput(minput);
        }

        public void DoubleClick(int time)
        {
            Click();
            Thread.Sleep(time);
            Click();
        }

        public void MoveCursor(Point absoluteCoordinate)
        {                   
            MOUSEINPUT minput = new MOUSEINPUT();
            Rectangle size = Screen.PrimaryScreen.Bounds;
            minput.dx = (MAX_ABSOLUTE_COORDINATE/size.Width) * absoluteCoordinate.X;
            minput.dy = (MAX_ABSOLUTE_COORDINATE/size.Height) * absoluteCoordinate.Y;
            minput.dwFlags = MOUSEEVENTF.MOVE | MOUSEEVENTF.ABSOLUTE;
            SendMouseInput(minput);
        }

        private void SendMouseInput(MOUSEINPUT input)
        {
            INPUT [] inputs = new INPUT[1] {new INPUT()};
            inputs[0].mi = input;           
            uint ret = SendInput((uint)inputs.Length,inputs,Marshal.SizeOf(inputs[0]));
            if ( ret != (uint)inputs.Length)
                throw new ApplicationException("SendInput error: " + Marshal.GetLastWin32Error().ToString());   
        }

        [DllImport("user32.dll",SetLastError=true)]
        private static extern void GetCursorPos(out Point p);

        [DllImport("user32.dll")]
        private static extern uint SendInput(uint nInputs, INPUT [] pInputs, int cbSize);

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


        [StructLayout(LayoutKind.Explicit)]
        struct INPUT
        {
            [FieldOffset(0)] public int type;
            [FieldOffset(4)] public MOUSEINPUT mi;
        }

        [Flags()]
        private enum MOUSEEVENTF
        {
            MOVE = 0x1, /* mouse move */
            LEFTDOWN = 0x2, /* left button down */
            LEFTUP = 0x4, /*left button up */
            RIGHTDOWN = 0x8, /*right button down */
            RIGHTUP = 0x10, /*right button up */
            MIDDLEDOWN = 0x20, /*middle button down */
            MIDDLEUP = 0x40, /* middle button up */
            WHEEL = 0x800, /*wheel button rolled */
            VIRTUALDESK = 0x4000, /* map to entrire virtual desktop */
            ABSOLUTE = 0x8000, /* absolute move */
            TOUCH = 0x100000, /* absolute move */
        }

        private const int MAX_ABSOLUTE_COORDINATE = 65535;
    }
Avatar billede keet Nybegynder
03. august 2005 - 06:36 #10
Skal jeg impotere nogle forskellige klasser for at det virker?

Errors:
The type or namespace name 'DllImport' could not be found
The type or namespace name 'StructLayout' could not be found
The type or namespace name 'FieldOffset' could not be found
Avatar billede keet Nybegynder
03. august 2005 - 07:03 #11
Jeg fik det til at virke ved at impotere:
using System.Runtime.InteropServices;
using System.Threading;
Avatar billede keet Nybegynder
03. august 2005 - 07:11 #12
Hmm.. min visuel studio lukker bare ned.. kigger lige på de senere idag
Avatar billede keet Nybegynder
03. august 2005 - 14:23 #13
Koden virker fint mht. til at flytte musen og dobbelklikke så der er bare fedt.

Mange tak for hjælepn driis :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester