Как я могу получить элемент события щелчка мыши в какао - PullRequest
0 голосов
/ 10 мая 2019

Я получаю события от кликов с глобальным монитором в macOS.NSEvent дает мне координаты, но мне нужно получить UIElement.

Используя API специальных возможностей, я могу получить сфокусированный элемент, но мне нужен элемент, по которому щелкают, который совершенно другой.Например, если я щелкаю текстовую область, я получаю элемент AXTextArea.Если я щелкну на панели задач приложения, сфокусированный элемент останется AXTextArea, что имеет смысл.Мне нужен элемент, связанный с событием мыши.

Я нашел в сети метод с именем accessibilityHitTest, который должен извлекать UIElement под данным NSPoint.Я всегда получаю нулевое значение, поэтому я не уверен, что это должно работать именно так.

Может быть, есть другая функция, которая извлекает UIElement из заданной точки на экране?

Вот что я делаюпробовал:

NSEvent *event; // My event received from global monitoring
id clickedObject = [self accessibilityHitTest:event.locationInWindow];
//This give me an error because self is not a NSWindow.

NSEvent *event; // My event received from global monitoring
id clickedObject = 
[[NSApp keyWindow] accessibilityHitTest:event.locationInWindow];
//This give me null at every click.

Может быть, это невозможно, но я просто могу получить UIElement под моим щелчком мыши, а не сфокусированный UIElement.

1 Ответ

2 голосов
/ 10 мая 2019

Для этого нужно использовать AXUIElementCopyElementAtPosition().Обратите внимание, что вы должны быть осторожны, чтобы предоставить координаты в правильной системе координат.Так как с событием не связано window (потому что оно для другого приложения), NSEvent *1005* использует систему координат Какао с началом координат в левом нижнем углу основного дисплея, с увеличением yв направлении вверх.AXUIElementCopyElementAtPosition() принимает координаты в системе координат Core Graphics с началом координат в верхнем левом углу основного дисплея, а y увеличивается вниз.По сути, вы делаете:

point.y = NSMaxY(NSScreen.screens[0].frame) - point.y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...