Неправильное местоположение с использованием [NSEvent mouseLocation]

Я делаю приложение удаленного контроллера мыши iphone для Mac: приложение iPhone отправляет значения координат на Mac, который затем обрабатывает значение местоположения мыши.

Чтобы получить текущее местоположение мыши на Mac, получатель вызывает [NSEvent mouseLocation].

Значение x всегда правильное, но значение y неправильное.

Я использовал цикл «while» для обработки этого события.

while (1) {
    mouseLoc = [NSEvent mouseLocation];

    while ((msgLength = recv(clientSocket, buffer, sizeof(buffer), 0)) != 0) {
          CGPoint temp;
          temp.x = mouseLoc.x;
          temp.y = mouseLoc.y; // wrong value
          ........

Значение y отличается в каждом периоде цикла. Например, значение y равно 400 в первом цикле, y равно 500 в следующем цикле; тогда y снова будет 400 в следующем цикле.

Указатель мыши постоянно поднимается и опускается, а сумма двух разных значений y всегда равна 900 (я думаю, потому что разрешение экрана составляет 1440 * 900).

Я не знаю, почему это происходит, что делать и как это отлаживать.


person 이민규    schedule 20.11.2011    source источник
comment
Насколько мне известно, mouseLocation не является статическим методом.   -  person David    schedule 20.11.2011
comment
@David mouseLocation - это метод класса NSEvent.   -  person apaderno    schedule 20.11.2011
comment
О, я думал, что это не так. Извините!   -  person David    schedule 20.11.2011
comment
@ 이민규 ты когда-нибудь в этом догадывался? У меня такая проблема.   -  person tsdexter    schedule 12.04.2012


Ответы (3)


Вот способ получить правильное значение Y:

while (1) {
mouseLoc = [NSEvent mouseLocation];
NSRect screenRect = [[NSScreen mainScreen] frame];
NSInteger height = screenRect.size.height;

while ((msgLength = recv(clientSocket, buffer, sizeof(buffer), 0)) != 0) {
      CGPoint temp;
      temp.x = mouseLoc.x;
      temp.y = height - mouseLoc.y; // wrong value
      ........

В принципе, я схватил высоту экрана:

NSRect screenRect = [[NSScreen mainScreen] frame];
NSInteger height = screenRect.size.height;

Затем я беру высоту экрана и вычитаю из нее координату Y mouseLocation, потому что mouseLocation возвращает координаты снизу / слева, это даст вам координату Y сверху.

temp.y = height - mouseLoc.y; // right value

Это работает в моем приложении, которое контролирует положение мыши.

person tsdexter    schedule 12.04.2012
comment
@Nicholaz, он не должен работать без проблем, если оба монитора имеют одинаковое разрешение - в противном случае вам может потребоваться дополнительная математика / проверка того, на каком мониторе находится мышь - вам нужно будет попробовать, чтобы узнать. - person tsdexter; 26.10.2012

Я не знаю, почему это могло измениться, не видя больше вашего кода, но есть большая вероятность, что это как-то связано с тем фактом, что mouseLoc = [NSEvent mouseLocation]; возвращает точку, начало которой находится в нижнем левом углу экрана, а не вверху слева, где обычно.

person BumbleShrimp    schedule 15.12.2011

Получите правильный код позиции:

CGPoint mousePoint = CGPointMake([NSEvent mouseLocation].x, [NSScreen mainScreen].frame.size.height - [NSEvent mouseLocation].y);
person TONy.W    schedule 25.01.2013