Моя Ма c настроена следующим образом: дисплей 5K расположен сверху встроенного дисплея Ма c.
Если мой курсор мыши находится на дисплее 5K, и я пытаюсь получить положение мыши следующим образом:
CGEventRef ourEvent = CGEventCreate(NULL);
NSPoint point = CGEventGetLocation(ourEvent);
CFRelease(ourEvent);
Я получаю неожиданное возвращаемое значение для point.x
. Например, если курсор находится в этой позиции:
NSLog(@"MOUSE POSITION X: %.0f px", point.x);
Тогда я вернусь MOUSE POSITION X: 1950 px
. Однако такое приложение, как Xscope, сообщает об этой позиции x как 3900 px .
Ни одно из этих значений не кажется правильным, так как экран имеет ширину 2560:
NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation];
NSLog(@"SCREEN WIDTH: %f", currentScreen.frame.size.width);
Примечание: currentScreenForMouseLocation исходит из NSScreen-PointConversion .
И если я переместу расположение 13 ", встроенный дисплей от центра, но все еще под дисплеем 5K, значение point.x
еще более неточно. Я вижу, что здесь есть некоторая математическая зависимость между различиями в размерах / разрешении экрана, но мне трудно вычислить точно, что происходит и как в конечном итоге превратить это в код, где я могу получить реальное point.x
значение для позиции курсора мыши.
Проблема, которую я пытаюсь решить, заключается в том, что мне нужно программно показать меню NSStatusItem, и мне нужно определить, является ли меню слишком широким, чтобы отображаться в правой части NSStatusItem. Код, который у меня работает, работает нормально, за исключением Определяется c положение вертикально расположенных дисплеев. В этой ситуации может произойти нечто подобное: