Дублиране на част от екрана към външен дисплей (в 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