Почему мое приложение просто останавливается и не запускается? - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь создать программу (C#), которая делает это:

  1. Если я щелкну левой кнопкой мыши, мышь должна переместиться влево с помощью DeltaX.

Проблема в том, что когда я запускаю программу, она просто открывает консольное приложение и ничего не происходит. Я не уверен, что я здесь делаю не так. Он должен продолжать работать и проверять, нажимаю ли я левую кнопку мыши или нет, и когда я нажимаю на нее, курсор должен перемещаться влево на DeltaX.

код

using System.Data;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;

namespace Teste
{
    class Program
    {
        static void Main(string[] args)
        {
            var someClass = new Up();
            someClass.Update();
        }
    }
        public class Up
        {
            [DllImport("user32.dll")] static extern short GetAsyncKeyState(int vKey);
            [DllImport("USER32.dll")] static extern short GetKeyState(int nVirtKey);

            int msShootTime = 225;
            System.DateTime lastClick = System.DateTime.Now;

            bool isRunning = true;
            public async void Update()
            {

                while (true)
                {
                    if (isRunning)
                    {
                        await Task.Delay(10);
                        continue;
                    }
                    int res = GetKeyState((int)1);
                    if (res >= 0)
                    {
                        await Task.Delay(1);
                        continue;
                    }
                    Move(-10, 0, true);
                }
            }



            private const int MOUSEEVENTF_LEFTDOWN = 0x02;
            private const int MOUSEEVENTF_LEFTUP = 0x04;
            private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
            private const int MOUSEEVENTF_RIGHTUP = 0x10;


            [DllImport("user32.dll")]
            static extern void mouse_event(int dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);

            public void Move(int xDelta, int yDelta, bool pressDown = false)
            {
                if (pressDown)
                {
                    if (System.DateTime.Now.Subtract(lastClick).TotalMilliseconds < msShootTime)
                    {
                        pressDown = false;
                    }
                    else
                    {
                        lastClick = System.DateTime.Now;
                    }
                }

                mouse_event(pressDown ? (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP) : 0x0001, xDelta, yDelta, 0, UIntPtr.Zero);

            }
        }
}

1 Ответ

2 голосов
/ 08 мая 2020

Некоторые ошибки были в коде, я добавил некоторые комментарии непосредственно в код

class Program
{
    static async Task Main(string[] args) // made Main async
    {
        var someClass = new Up();
        await someClass.Update(); // awaiting async method, you didn't wait it and app have to exit immediately
    }
    public class Up
    {
        [DllImport("user32.dll")]
        private static extern short GetAsyncKeyState(int vKey);
        [DllImport("user32.dll")]
        private static extern short GetKeyState(int nVirtKey);

        // just copied mouse_event and Flags from one of my projects but yours worked too
        [DllImport("user32.dll")]
        private static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, uint dwData, UIntPtr dwExtraInfo);

        [Flags]
        private enum MouseFlags : uint 
        {
            MOUSEEVENTF_ABSOLUTE = 0x8000,   // If set, dx and dy contain normalized absolute coordinates between 0 and 65535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.
            MOUSEEVENTF_LEFTDOWN = 0x0002,   // The left button is down.
            MOUSEEVENTF_LEFTUP = 0x0004,     // The left button is up.
            MOUSEEVENTF_MIDDLEDOWN = 0x0020, // The middle button is down.
            MOUSEEVENTF_MIDDLEUP = 0x0040,   // The middle button is up.
            MOUSEEVENTF_MOVE = 0x0001,       // Movement occurred.
            MOUSEEVENTF_RIGHTDOWN = 0x0008,  // The right button is down.
            MOUSEEVENTF_RIGHTUP = 0x0010,    // The right button is up.
            MOUSEEVENTF_WHEEL = 0x0800,      // The wheel has been moved, if the mouse has a wheel.The amount of movement is specified in dwData
            MOUSEEVENTF_XDOWN = 0x0080,      // An X button was pressed.
            MOUSEEVENTF_XUP = 0x0100,        // An X button was released.
            MOUSEEVENTF_HWHEEL = 0x01000     // The wheel button is tilted.
        }

        int msShootTime = 225;
        DateTime lastClick = DateTime.Now;

        bool isRunning = false; // it was initially true
        public async Task Update() // async Task
        {

            while (true)
            {
                if (isRunning) // it was always true
                {
                    await Task.Delay(10);
                    continue; // this was always executed
                }
                isRunning = true; // added this
                int res = GetKeyState((int)1);
                if (res >= 0)
                {
                    await Task.Delay(1);
                    isRunning = false; // added this
                    continue;
                }
                Move(-10, 0, true);
                isRunning = false; // added this
            }
        }

        public void Move(int xDelta, int yDelta, bool pressDown = false)
        {
            if (pressDown)
            {
                if (System.DateTime.Now.Subtract(lastClick).TotalMilliseconds < msShootTime)
                {
                    pressDown = false;
                }
                else
                {
                    lastClick = System.DateTime.Now;
                }
            }

            // updated for new Flags enum
            // I'm not sure if sending both MOUSEEVENTF_LEFTDOWN and MOUSEEVENTF_LEFTUP will give any effect
            // try to send it sequentially with some delay: DOWN, then UP
            mouse_event(pressDown ? (MouseFlags.MOUSEEVENTF_LEFTDOWN | MouseFlags.MOUSEEVENTF_LEFTUP) : MouseFlags.MOUSEEVENTF_MOVE, xDelta, yDelta, 0, UIntPtr.Zero);
        }
    }
}

Примечание: Microsoft рекомендует использовать SendInput вместо mouse_event.

Эта функция заменена. Вместо этого используйте SendInput.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...