Как получить положение, ширину и высоту док-станции Mac OS X? Какао/углерод/C++/Qt

Я пытаюсь получить положение и ширину док-станции Mac OS X в моем приложении C++/Qt. Но я могу найти только способы получить доступное пространство рабочего стола, это означает, что я могу получить высоту дока, но не ширину.

Есть ли способы получить положение и ширину док-станции с помощью собственного API ОС?


person IGHOR    schedule 06.03.2016    source источник
comment
Можете объяснить, зачем нужна ширина Дока? Когда вы вручную изменяете размер окна, вы не можете опускаться ниже Dock. Это возможно только при перемещении окна вниз, и это совершенно бесполезно.   -  person MBach    schedule 16.03.2016
comment
Можно получить подсказку по этой ссылке cocoabuilder.com/archive /какао/   -  person Dendi Suhubdy    schedule 17.03.2016
comment
Матье, я хочу сделать фоновое окно/виджет, привязанное к размеру дока.   -  person IGHOR    schedule 17.03.2016
comment
Dendi Suhubdy, да, это может быть частичное решение, как подсчитать значки Dock?   -  person IGHOR    schedule 17.03.2016
comment
Вы можете получить количество элементов в нем, прочитав ~/Library/Preferences/com.apple.dock.plist , persistent-apps и persistent-others. Затем вычислите некоторую оценку ширины дока, используя его высоту (см. другие ответы).   -  person tmlen    schedule 12.02.2019
comment
tmlen, это хорошая идея, я ею воспользуюсь. Но как насчет новых окон, которые не прикреплены к док-станции?   -  person IGHOR    schedule 13.02.2019


Ответы (3)


Не похоже, что такое возможно, даже из API-интерфейсов Apple, не говоря уже о Qt.

Единственное решение, которое приходит на ум, довольно грубое, — это сделать снимок экрана и использовать базовое распознавание изображений, чтобы определить положение и размеры дока.

person dtech    schedule 15.03.2016
comment
Я думаю, что могу использовать Cocoa или Carbon API в приложении Qt C++, поэтому Qt не проблема. Сделайте снимок экрана, и распознавание изображений может работать, но это не интеллектуальное решение, и оно может не работать во многих ситуациях. - person IGHOR; 17.03.2016
comment
Я ничего не нашел о доступе к свойствам док-станции из API-интерфейсов Apple. - person dtech; 17.03.2016

Это может помочь в решении без взлома, NSScreen предоставляет метод (visibleframe), который вычитает меню и док из размера экрана. Метод frame содержит и то, и другое.

[NSStatusBar system​Status​Bar].thickness вернет высоту строки меню.

https://developer.apple.com/reference/appkit/nsscreen/1388369-visibleframe?language=objc

person MacAndor    schedule 20.03.2017
comment
Спасибо за ответ. Нет проблем с высотой, я не могу получить ширину. - person IGHOR; 21.03.2017
comment
Ну, единственный известный мне API, который вы можете использовать для этого, — это Apple Accessibility API, хотя это зависит от вашего варианта использования, рекомендую ли я его или нет: developer.apple.com/reference/applicationservices/ - person MacAndor; 21.03.2017

Чтобы расширить ответ Макандора, вы можете определить положение док-станции, сравнив -[NSScreen visibleFrame] (исключая пространство, занимаемое док-станцией и строкой меню) с -[NSScreen frame], который охватывает всю ширину и высоту экрана.

Приведенный ниже пример кода зависит от экрана, на котором находится окно. Этот код можно адаптировать для работы с несколькими дисплеями, перебирая все экраны вместо использования экрана окна.

// Infer the dock position (left, bottom, right)
NSScreen *screen = [self.window screen];    
NSRect visibleFrame = [screen visibleFrame];
NSRect screenFrame = screen.frame;

if (visibleFrame.origin.x > screenFrame.origin.x) {
    NSLog(@"Dock is positioned on the LEFT");
} else if (visibleFrame.origin.y > screenFrame.origin.y) {
    NSLog(@"Dock is positioned on the BOTTOM");
} else if (visibleFrame.size.width < screenFrame.size.width) {
    NSLog(@"Dock is positioned on the RIGHT");
} else {
    NSLog(@"Dock is HIDDEN");
}
person Andrew    schedule 31.07.2018
comment
Спасибо за подробный ответ. Но это не то, о чем я прошу. Мне нужна ширина для док-станции, пока она внизу. И Высота при этом слева или справа. Также получает новый размер, если какой-либо элемент дока удален/добавлен. - person IGHOR; 01.08.2018
comment
@ Андрей +1 за понимание. @IGHOR, нужные вам ширина и высота находятся прямо в операторе if: dockLeft = visibleFrame.origin.x - screenFrame.origin.x; и dockHeight = visibleFrame.origin.y - screenFrame.origin.y; и dockRight = screenFrame.size.width - visibleFrame.size.width; - person Jeff; 18.07.2020
comment
@Jeff спасибо за ответ, но он не работает для левой/правой/ширины, так как это всегда screenFrame.size.width == visibleFrame.size.width и visibleFrame.origin.x == screenFrame.origin.x - person IGHOR; 18.07.2020
comment
@IGHOR В моем случае мне нужно было только одно из этих значений (смещение левого дока, смещение правого дока или смещение нижнего дока), и я мог вычислить это одно значение на основе первого истинного условия в этих операторах if. Я использую iMac 27 дюймов с одним экраном. - person Jeff; 20.07.2020
comment
@Jeff Я понимаю, но смещение влево/вправо вашего кода всегда равно нулю или равно ширине экрана. Вы уверены, что этот код дает вам реальное смещение положения док-станции, если док-станция находится внизу? Только так можно рассчитать высоту дока. - person IGHOR; 20.07.2020