Проблемы с расположением мыши OS X - PullRequest
1 голос
/ 15 декабря 2011

Я пытаюсь программно замедлить курсор мыши, умножая дельту мыши на число от 1 до 0 при каждом событии перемещения мыши. Это нормально работает для оси X, но позиция Y всегда перемещается обратно в центр экрана, это очень странно.

Я не могу понять, почему позиция Y курсора перемещается к центру экрана независимо от того, перемещаете ли вы мышь вверх или вниз ...

Я установил CGEventTap для событий перемещения мыши, и это код для обратного вызова:

CGEventRef 
mouse_filter(CGEventTapProxy proxy, CGEventType type, CGEventRef event, float *speed_modifier) {


    CGPoint point = CGEventGetLocation(event);
    NSPoint old_point = [NSEvent mouseLocation];
    CGPoint target; 

    int tX = point.x; 
    int tY = point.y; 
    float oX = old_point.x;
    float oY = old_point.y;
    float dX = tX-oX;
    float dY = tY-oY;


    dX*=0.1, dY*=0.1;
    tX = round(oX + dX);
    tY = round(oY + dY);


    target = CGPointMake(tX, tY);

    CGWarpMouseCursorPosition(target);




    return false;
}

Может кто-нибудь помочь мне разобраться, как это сделать?

Я зарегистрировал некоторые значения во время работы приложения и обнаружил, что oY не содержит ожидаемых значений ... кажется, что оно всегда близко к 430, обычно в паре пикселей от этого. tY содержит, казалось бы, правильное целевое значение, поэтому вполне понятно, что oY из одной итерации должен быть равен tY из предыдущей (работает правильно для значений X), однако, oY всегда близко к 430, даже когда мышь должна двигаться к верхней части экрана. Это заставляет меня думать, что dY каким-то образом устанавливается значение, которое вернет oY обратно к 430, но я не могу понять, как это происходит, так как dY, похоже, также выводит правильное значение ...

1 Ответ

2 голосов
/ 15 декабря 2011

CGPoint point = CGEventGetLocation(event); точка, в которой (0,0) - верх слева от экрана.

NSPoint old_point = [NSEvent mouseLocation]; это точка, где (0,1) является внизу слева от экрана.

Я, если получу высоту экрана, сделаю:

'oY = abs (oY - screen_height + 1); `, oY теперь расположены в верхнем левом углу экрана, и мое приложение работает правильно.

...