Перемещение мыши без ускорения в C ++ с помощью mouse_event - PullRequest
2 голосов
/ 21 декабря 2009

Прямо сейчас, когда я пробую цикл, который содержит что-то вроде:

mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0);

Мышь имеет тенденцию двигаться больше, чем (dx, dy). Исследуя это онлайн, я думаю, что это происходит из-за ускорения операционной системы. Как я могу переместить мышь на абсолютную величину?

Возможно, MOUSEEVENTF_ABSOLUTE может быть тем, что я ищу, но я не понимаю, как его использовать.

Я пробовал:

mouse_event(MOUSEEVENTF_ABSOLUTE || MOUSEEVENTF_MOVE,dx,dy,0,0);

но это тоже не работает. Я бы предпочел использовать mouse_event, а не SetCursorPos или другие методы, что мне делать? Спасибо.

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

Координаты не являются пиксельными координатами и должны быть нормализованы.

#include <Windows.h>
#include <tchar.h>

int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) {
  INPUT input = {0};

  int screenX = GetSystemMetrics( SM_CXVIRTUALSCREEN );
  int screenY = GetSystemMetrics( SM_CYVIRTUALSCREEN );

  for( unsigned int i = 0; i < 10; i++ ) {
    input.mi.dx = i*10 * ( 65535/screenX );
    input.mi.dy = i*10 * ( 65535/screenY );
    input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_MOVE;
    input.type = INPUT_MOUSE;

    SendInput( 1, &input, sizeof INPUT );
    Sleep( 1000 );
  }

  return ERROR_SUCCESS;
}

Я использовал SendInput () здесь вместо mouse_event (), потому что последний был заменен согласно документам Если вы хотите преобразовать его обратно, параметры должны быть примерно такими же.

4 голосов
/ 21 декабря 2009

из winuser.h

#define MOUSEEVENTF_MOVE        0x0001
#define MOUSEEVENTF_ABSOLUTE    0x8000

MOUSEEVENTF_MOVE || MOUSEEVENTF_ABSOLUTE - это то же самое, что и 0x0001 || 0x8001, который оценивается в true, который просто равен 1!

Попробуйте еще раз с MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, и это, вероятно, будет работать.

Edit: немного посмотрев документы, кажется, что либо вы хотите MOUSEEVENTF_ABSOLUTE все само по себе. или вам нужно учитывать тот факт, что диапазон значений, который он ищет, составляет 0-65535, масштабированный по всему экрану.

Если указано значение MOUSEEVENTF_ABSOLUTE, dx и dy содержат нормализованные абсолютные координаты от 0 до 65 535. Процедура события отображает эти координаты на поверхности дисплея. Координаты (0,0) отображаются в верхнем левом углу поверхности отображения, (65535,65535) отображаются в нижнем правом углу.

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