Зеркальное отображение части экрана на внешний дисплей (в OSX)

Я хотел бы написать программу, которая может отображать часть основного экрана в новом окне. В идеале это новое окно можно было бы затем отобразить на внешнем мониторе. Я видел эту утилиту для FlightSim, который делает это на ПК (многофункциональный экстрактор дисплея).

Щелкните здесь, чтобы увидеть снимок экрана программы (MFD Extractor)

Это будет живое окно, т.е. постоянно обновляемое видео отображать не просто статичную графику.

Я смотрел на экранные лупы или клиенты vnc для идей, но я думаю, что мне нужно написать что-то с нуля. Я попытался немного почитать о программировании OSX, но с чего мне начать, чтобы получить доступ к дисплею? Мне как-то нужно извлечь графику из конкретной программы. Лучше ли идти ближе к конечному этапу вывода (отдельные пиксели, отправленные на дисплей) или где-то ближе к этапу управления окном.

Любые идеи или указатели будут высоко оценены. Мне просто нужно с чего-то начать.

С уважением,


person Adam    schedule 30.04.2010    source источник
comment
Большинство из нас не может запустить эту программу, так как мы не используем Windows. Ссылка на описание или скриншот была бы более полезной.   -  person Peter Hosey    schedule 02.05.2010


Ответы (1)


Есть несколько способов сделать это:

  1. Quartz Display Services позволит вам получить доступ к видеопамяти для экрана.
  2. Quartz Window Services (он же CGWindow) позволит вам создавать образ всего, что находится под окном. Если вы создаете без полей, прозрачный, пустой, высокий-уровня, фрейм которого занимает весь экран, все, что ниже, будет всем на этом экране. (Конечно, вы можете создать окно меньшего размера, чтобы скопировать часть экрана.)
  3. Есть также способ сделать это с помощью OpenGL, который я так и не понял. Этот метод демонстрируется парой примеров кода: OpenGLScreenSnapshot и OpenGLCaptureToMovie. Однако CGWindow более или менее устарел.

Каждый из них даст вам изображение, которое вы затем сможете показать или записать в файл или что-то в этом роде.

Чтобы показать изображение, используйте NSImageView или IKImageView. Если вы хотите увеличить его, IKImageView имеет свойство zoomFactor, но если вам нужно масштабирование ближайшего соседа (например, Pixie, DigitalColor Meter или xScope), я думаю, вам нужно будет написать собственное представление для этого (но даже это не так уж сложно).

person Peter Hosey    schedule 01.05.2010
comment
Спасибо за ваши предложения. Можно ли использовать эти методы (такие как CGWindowListCreateImageFromArray от Quartz Window Services и NSImageView) для создания зеркального отображения живого видео, а не статических изображений? Я предполагаю, что это будет зависеть от частоты опроса или обновления, которая может быть синхронизацией или частотой прерывания обновления экрана. Или, если это мое намерение, есть ли другие маршруты или альтернативные функции, которые я должен использовать? Еще раз спасибо. - person Adam; 07.05.2010