Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
DarkPower
0 / 0 / 1
Регистрация: 20.03.2013
Сообщений: 80
#1

Нелогичная работа mouse_event MOUSEEVENTF_MOVE - C++

29.01.2015, 04:52. Просмотров 1707. Ответов 6
Метки нет (Все метки)

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
void Draw()
{
    HDC hdc = GetDC(HWND_DESKTOP);
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
    int x = RandomMinMax(1,cx);
    int y = RandomMinMax(1,cy);
    int size = 5;
    POINT p;
    GetCursorPos(&p);
    for(int i =0;i<50;i++) std::cout << "\n";
    
    int fx,fy;
    if (p.x > x) fx = p.x-x;
    if (x >= p.x) fx= x=p.x;
    std::cout << "\np.x = " << p.x;
    std::cout << "\nx = " << x;
    std::cout << "\nx-p.x = " << x-p.x;
    mouse_event(MOUSEEVENTF_MOVE, x-p.x,y-p.y, 0, 0);
    GetCursorPos(&p);
    std::cout << "\np.x = " << p.x;
    std::cout << "\nx = " << x;
    for(int i = 0-size; i<size; i++)
    {
        for(int j=0-size; j<size;j++)
        {
            SetPixel(hdc,x-i,y-j,RGB(RandomMinMax(180,255),0,0));
        }
    }
}
Код создает рандомно на экране квадратик. И перемещает (должен) туда мышку.
Код вроде бы правильный, но перемещает он не на квадратик, а куда ему захотелось...
В чем ошибка? Не пойму...

Пример выполнения:
Пускай XR=20 (рандомная позиция)
XС=10 (текущия позиция курсора)
FX=XR-XC; (10)
то если выполнить mouse_event(MOUSEEVENTF_MOVE, FX,0, 0, 0); (Позиция Х курсора должна быть сдвинута в право на 10 пикселей)

Пускай XR=5 (рандомная позиция)
XС=10 (текущия позиция курсора)
FX=XR-XC; (-5)
то если выполнить mouse_event(MOUSEEVENTF_MOVE, FX,0, 0, 0); (Позиция Х курсора должна быть сдвинута в лево на 5 пикселей)
Но программа, двигает как-то рандомно.
если же вписать вручную:
mouse_event(MOUSEEVENTF_MOVE, 10,0, 0, 0) - то курсор отлично сдвигается в право на 10 пикселей..
В чем проблема?
http://www.cyberforum.ru/cpp-builder/thread336878.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2015, 04:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нелогичная работа mouse_event MOUSEEVENTF_MOVE (C++):

Mouse_event колизия координат
здравствуйте уважаемые форумчане. mouse_event(MouseFlags.Move , X - CurrentX,...

Очередь сообщений mouse_event
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) {...

Нелогичная работа кода
Есть код. Но делает он совсем не то, что по идее должен. Вот код: 1) файл...

Нелогичная работа простейших арифметических операций
Я не понимаю почему так работает сложение. Dim file3 = New...

Не правильная работа функции "mouse_event"
Добрых времени суток. Таких тем на форуме валом, но не в одной я не нашел...

6
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
29.01.2015, 08:25 #2
Цитата Сообщение от DarkPower Посмотреть сообщение
В чем проблема?
В том, что все, что вы описали словами, отсутствует в коде.
К примеру, вы говорите
Цитата Сообщение от DarkPower Посмотреть сообщение
если выполнить mouse_event(MOUSEEVENTF_MOVE, FX,0, 0, 0);
а в предоставленном коде никакого fx нет:
Цитата Сообщение от DarkPower Посмотреть сообщение
mouse_event(MOUSEEVENTF_MOVE, x-p.x,y-p.y, 0, 0);
В пятнадцатой строке опечатка: if (x >= p.x) fx= x=p.x;

Короче переписывайте внимательно свой код.
0
DarkPower
0 / 0 / 1
Регистрация: 20.03.2013
Сообщений: 80
29.01.2015, 11:51  [ТС] #3
Извинете, забыл удалить. Но это ничего не меняет...
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
void Draw()
{
    HDC hdc = GetDC(HWND_DESKTOP);
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
    int x = RandomMinMax(1,cx);
    int y = RandomMinMax(1,cy);
    int size = 5;
    POINT p;
    GetCursorPos(&p);
    for(int i =0;i<50;i++) std::cout << "\n";
    
    int fx,fy;
    fx = x-p.x; fy = y-p.y;
    std::cout << "\nПозиция курсора = " << p.x;
    std::cout << "\nПозиция точки = " << x;
    mouse_event(MOUSEEVENTF_MOVE, fx,fy, 0, 0);
    GetCursorPos(&p);
    std::cout << "\nПозиция курсора = " << p.x;
    for(int i = 0-size; i<size; i++)
    {
        for(int j=0-size; j<size;j++)
        {
            SetPixel(hdc,x-i,y-j,RGB(RandomMinMax(180,255),0,0));
        }
    }
}
Все равно двигает курсор в рандомную позицию

Добавлено через 31 минуту
Если написать так то:
C++
1
2
3
4
5
6
        std::cout << "\nCur = " << p.x;
    std::cout << "\nP = " << x;
        
    mouse_event(MOUSEEVENTF_MOVE, -100,0, 0, 0);
    GetCursorPos(&p);
    std::cout << "\nCur = " << p.x;
Курсор сдвигается не на 100, а на 100-200.

Если двигать по 10:
C++
1
2
3
4
5
6
        std::cout << "\nCur = " << p.x;
    std::cout << "\nP = " << x;
        
    mouse_event(MOUSEEVENTF_MOVE, -10,0, 0, 0);
    GetCursorPos(&p);
    std::cout << "\nCur = " << p.x;
Курсор сдвигается не на 11.

Добавлено через 7 минут
Если сдвинуть 10 раз по 10, то примерно сдвигает на 100 (ну хоть не 200-300 как в mouse_event(MOUSEEVENTF_MOVE, -100,0, 0, 0);)
0
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
29.01.2015, 12:00 #4
C++
24
SetPixel( hdc, p.x-i, p.y-j, RGB( RandomMinMax( 180, 255 ), 0, 0) );
x и y - это смещение. Это не координаты.

P.S. Почитайте про SetCursorPos();
0
DarkPower
0 / 0 / 1
Регистрация: 20.03.2013
Сообщений: 80
29.01.2015, 12:12  [ТС] #5
Меня не интересует SetCursorPos.
C++
1
2
int x = RandomMinMax(1,cx);
int y = RandomMinMax(1,cy);
x и y это координаты...

Добавлено через 1 минуту
Вобщем я хочу с помощю MOUSEEVENTF_MOVE передвинуть курсор в указанную позицию.
Как реализовать?
0
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
29.01.2015, 12:48 #6
Цитата Сообщение от DarkPower Посмотреть сообщение
x и y это координаты
Вы наркоман?
Цитата Сообщение от DarkPower Посмотреть сообщение
Как реализовать?
Запустите ваш же код, заменив в нем двадцать четвертую строку, которую я привел выше.
0
DarkPower
0 / 0 / 1
Регистрация: 20.03.2013
Сообщений: 80
29.01.2015, 23:39  [ТС] #7
Нашол решение данной проблемы.
Кому надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Draw()
{
        HDC hdc = GetDC(HWND_DESKTOP);
        int cx = GetSystemMetrics(SM_CXSCREEN);
        int cy = GetSystemMetrics(SM_CYSCREEN);
        int x = RandomMinMax(1,cx);
        int y = RandomMinMax(1,cy);
        int size = 5;
        POINT p;
        GetCursorPos(&p);
        int screenW=GetSystemMetrics(SM_CXSCREEN);
        int  screenH=GetSystemMetrics(SM_CYSCREEN);
        int kx = 65535 / screenW;
        int ky = 65535 / screenH;
        mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x*kx, y*ky, 0, 0);
        for(int i = 0-size; i<size; i++)
        {
            for(int j=0-size; j<size;j++)
            {
                SetPixel(hdc,x-i,y-j,RGB(RandomMinMax(180,255),0,0));
            }
        }
}
Добавлено через 2 минуты
"Как реализовать?
Запустите ваш же код, заменив в нем двадцать четвертую строку, которую я привел выше."
Это не правильно.

C++
1
2
3
4
5
mouse_event(MOUSEEVENTF_MOVE, fx,fy, 0, 0);
GetCursorPos(&p);
...
 SetPixel(hdc,x-i,y-j,RGB(RandomMinMax(180,255),0,0)); (если бы я написал как вы говорите, то оно бы рисовало по координатам мышки после mouse_event, а не по рандомным числам X и Y)
...
Добавлено через 6 минут
Вы предлагаете нарисовать квадрат уже после mouse_event, а мне надо нарисовать квадрат по рандомным X и Y, и потом же методом MOUSE_MOVE переместить мышку на квадрат

Добавлено через 10 часов 39 минут
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
Высчитал функцию X координаты (думаю многим поможет)
void DarkPower()
{
        HDC hdc = GetDC(HWND_DESKTOP);
        int cx = GetSystemMetrics(SM_CXSCREEN);
        int cy = GetSystemMetrics(SM_CYSCREEN);
        int x = RandomMinMax(1,cx);
        int y = RandomMinMax(1,cy);
        int size = 5;
        POINT p;
        GetCursorPos(&p);
        std::cout << "\nX1 = " << p.x;
        int fx = x-p.x;
        std::cout << "\nfx = " << fx;
        int fa = fx / 3;
        int fb = fx %3;
        if (fa >= 0) for (int i = 0; i<=fa+(fx*0.1267);i++) mouse_event(MOUSEEVENTF_MOVE, 3, 0, 0, 0);
        else for (int i = 0; i<=abs(fa)+(abs(fx)*0.1267);i++) mouse_event(MOUSEEVENTF_MOVE, -3, 0, 0, 0);
        mouse_event(MOUSEEVENTF_MOVE, fb, 0, 0, 0);
        GetCursorPos(&p);
        std::cout << "\nX2 = " << p.x;
        for(int i = 0-size; i<size; i++)
        {
            for(int j=0-size; j<size;j++)
            {
                SetPixel(hdc,x-i,y-j,RGB(RandomMinMax(180,255),0,0));
            }
        }
}
0
29.01.2015, 23:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2015, 23:39
Привет! Вот еще темы с решениями:

нелогичная ошибка
Переопределяю класс QGraphicsPixmapItem. Я не думал что проблемы вообще...

Подключение mouse_event
Доброго времени суток! Пишу кликер - по нажатию на кнопку &quot;Перейти в точку&quot;...

Мышка и mouse_event
Почему при использовании mouse_event не получается закрыть окно? Добавлено...

Не срабатывает mouse_event в игре
есть код,отлично работающий в виндовсеprocedure TForm2.Button1Click(Sender:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru