ScreenSaver

Тема в разделе "WASM.ASSEMBLER", создана пользователем pikador, 3 апр 2007.

  1. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Всем привет!
    У меня может быть необычный вопрос, хотя 50% его процентов наверняка уже задавалась...

    Каким образом можно получить изображение, которое на мониторе в данный момент?
    Интересует два способа:
    1.Программный, т.е. не обращаясь к самому монитору(т.е. что должно быть на экране)
    2.Аппаратный, т.е. обращаясь к монитору, как к устройству(т.е. непосредственное изображение на устройстве)

    Есть надумки или варианты?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pikador
    1. ... 2. ...
    Под какую ОС?

    2.Аппаратный, т.е. обращаясь к монитору, как к устройству
    Про чтение видеопамяти знаю, но стобы читать _из_ монитора не слышал.
     
  3. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Вынь ХП

    Знаю только то что можно считать программно(наверно до того как вынь передает все монику) и напрямую(наверно через порты ввода\ввыода) .... А как именно не знаю...
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    CreateDC( "DISPLAY", ... ) не рулит?
    )))))))))))
     
  5. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Вроде устраивает, ток в масме что надо подключить для функций:
    extern CreateDC@16:NEAR
    extern GetPixel@12:NEAR
    extern DeleteDC@4:NEAR

    Ну и до кучи:
    extern PlaySound@12:NEAR
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pikador
    считать программно(наверно до того как вынь передает все монику)
    Шутишь? 1 апреля уже прошло.
    Изображение хранится (разумеется, пока питание есть) в видеопамяти и "постоянно" передается на монитор.

    extern GetPixel@12:NEAR
    Читать попиксельно - это не дело. Win GDI содержит функции оперирующие блоками.
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    pikador
    Шутишь, наверное, на монитор подается:
    1) с аналогового выхода (VGA) передается два сигнала синхронизации, на смену строки и смену кадра, и три аналоговых сигнала сигнала (на красную, синюю и зеленую пушку) определяющие цвет и яркость текущего пиксела
    2) если есть цифровой выход (DVI), то те же сигналы синхронизации + аналоговый сигнал разложенный на цифровые составляющие (т.е. N градаций красного, N градаций синего, N зеленого) + дополнительные управляющие сигналы прогоняются через кодер и востанавливаются на стороне монитора декодером
    Хочешь подменять изображение, делай это в видеопамяти, иначе нельзя
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    =)
    тебе потребуются CreateCompatibleDC, CreateCompatibleBitmap, BitBlt (кажется). Пример снимки скриншота есть в MSDN, ищи.
    Зачем?
    Лучше юзать документированные средства, описанные в MSDN, чем что-либо другое
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я не понимаю, зачем ему проигрывать звук для снятия скриншота. если ктонибудь объяснит мне роль PlaySound в получении изображения, буду очень благодарен ))))
     
  11. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    =)))))) Мда....))
    На самом деле, все что я говорю имеет очень глубокий смысл.
    Раскрывать который я не буду, а как сделаю может и выложу тут, но такого в паблике нет и небыло никогда...)))

    Про звук и видео карты, это разные темы))) Ржу немогу...

    Отлично, посмотрю(кста линк не кинешь?), этот способ зачетный, подходит....


    И еще вопрос:
    Ммм..... Каким макаром можно придумать перехват этих аналоговых сигналов каждый кадр? Пусть даже мы получим все не цветах на пиксель, устроит даже напряжение....
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    pikador
    Ну ты блин даешь... На видеокарте есть технологический разъем, цепляй к нему осцилограф и мерь,
    (только видюху не сожги, а то скажешь потом, что не предупредили) всё равно ты получаешь то, что у тебя видеобуфер в цикле выводит на экран. Адрес видеобуфера начинается с 0A0000h по 0BFFFFh. Доступ к полному объему видеобуфера идет через переключение страниц по 64k. Разбирайся с VESA, плюс придется разбираться с драйвером конкретно твоей видеокарты. В общем, потянуло тебя не в ту степь, но раз уж просишь ;)
     
  13. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    чтобы получить картинку десктопа (она тебе нужна для скринсейвера?), копать в сторону:
    Код (Text):
    1. GetDesktopWindow
    2. LockWindowUpdate
    3. GetClientRect
    4. GetDCEx
    5. CreateDIBSection
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В MSDN есть специальная страничка, называется "Capturing an Image".
    Для особо немощных цитирую:
     
  15. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Гы... А можно без доп.устройств? все должно быть программно....
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну программно тогда тебе BitBlt :P
     
  17. pikador

    pikador New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2007
    Сообщения:
    101
    Я понимаю, что ото может выглядеть тупо, но есть еще способ помимо битблт.
    ВОООООБЩЕ без функций винды, эт на уровне ядра, напрямую как то можно получить....
     
  18. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Чувак, тебе ясно сказали: BitBlt.
    Без функций винды это ты как себе представляешь? Писать в видеопамять (о чем тебе не раз говорили)? Тогда пиши драйвер. Только его тоже надо загружать с помощью любимых функций винды. Да и драйвер будет не на 10 строк, а раз эдак в 50 побольше. Можно без драйвера, но это будет еще сложнее (раза в 3). Оно тебе это надо?
    Если просто разукрашивать пиксели, то и виндовый GDI сгодится. Ну а если ты выводишь анимацию взрыва ядерной бомбы, то это уже лучше DirectX/OpenGL использовать.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    пишешь драйвер, который мапирует физический адрес начала видеобуфера к тебе в адресное пространство и херачишь его. только это геморрой тот еще.
    не ищи себе проблем на свои вторые девяносто :))