GDI - Блокирование экрана

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 28 Feb 2010.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Облазел пол инета, так и не нашел инфы по этому поводу, но точно уверен что она есть )

    Суть вот в чем:
    Необходимо временно заблокировать перерисовку экрана и вывод на экран. Или выводить изображения которые не будут стираться пока я сам не сотру его.
    т.е. после захвата, ни одна программа не может ничего вывести на экран, т.е. любой вывод графики просто не отображается на экране или не затирает данные которые написаны поверх них.
    Затем после освобождения, необходимо всё становится на свои места.

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

    И вот главное:
    0) толко юзермодный код, без каких либо дров.
    1) без DirectX/OpenGL
    2) код чисто на WinAPI с использованием GDI
    3) при этом создание полноэкранного окна которое поверх всех окон - не предлагать.

    Суть метода который видел:
    Какимто образом всё рисовалось поверх всего, и даже перемещение формы над этим местом ни затирало данные. т.е. по аналогии с рисованием на GetDC(0) тока какбы уровнем выше где обычные проги не смогут стереть. Код был коротки и без всякого извращения.
     
  2. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Предлагаю копать в сторону DrawEscape/Escape
    _http://www.realcoding.net/article/view/1985 - тут подробная информация о структурах
     
    #2 flacs, 28 Feb 2010
    Last edited: 28 Feb 2010
    1 person likes this.
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если не знаешь наверняка, то лучше не пиши.

    Данные функции созданы совершенно для других целей.
    Они являются частью системы работы с метафайлами и если метафайл должен вызвать какойто код, то это он делает через эскейп, т.е. вызывается адрес указанный в ней. Мего известная бага WMF, как раз и была основана на вызове шеллкода через функцию эскейп.
     
  4. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Ой блин slesh. Я не мего кодер, но чувак предложил просто вариант... Не у всех голова варит в таком диапазоне, как у тебя =\
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 ex3me я ничего не имею против предложений которые реально по теме, даже пусть самые бредовые но по теме. Или же когда есть реальный вариант копать материал в нужном направлении, а тут дело совершенной в другом, темболее что MSDN есть у многих, а у кого нет то есть инет. И там описано что за функция и что она делает.

    А если по теме, то перерыл все функции GDI работы с устройства или контекстом устройств и там нет ни единой зацепки по этому поводу :'(
     
  6. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    хоть ты и просил не писать если не уверен, но может
    нужно создать новый контекст, и уже на нем рисовать.
    что-то вроде:
    HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);

    сорри если не в тему.
     
    2 people like this.
  7. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    сабж тоже интересует. слеш, если найдёш снова тот код, скинь ссылку плиз.
     
  8. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Вариант?
    Code:
    SendMessage(GetDesktopWindow (), WM_SETREDRAW, false, 0);
    
     
    _________________________
    1 person likes this.
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    хм. почти оно. т.е. экран заблокирован. Но теперь возникает другая проблема:
    Чтобы что-то вывести, необходимо сначала нарисовать это а тока потом заблокировать экран, чтобы перерисовать то что нарисовал, то нужно снова разблокировать экран.
    Тут как я понимаю нужно теперь каким-то образом определить адрес экранного буфера для данного контекста и выводить информацию напрямую в буфер.
    Так что остаётся последняя задача )
     
  10. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    на 7ке если вызвать диспетчер (Cntrl+Alt+Del) то все перестает работать... на висте думаю будет так же... и на тех компах на которых для входа требуется нажать CAD...
     
  11. BastardFromHell

    Joined:
    5 Feb 2010
    Messages:
    50
    Likes Received:
    18
    Reputations:
    6
    можно скопировать всю картинку с текущего экрана в BMP в память, потом создать своё systemmodal окно размером с экран, и отобразить там картинку. Если я правильно тебя понял конечно. Вообще самому интересно стало, помню раньше были игры такие, перерисовка блокировалась, и можно было стрелять по экрану из пистиков, автоматиков и тд.
    Если бы найти такую игруху, можно было бы глянуть, чего там и как работает.
     
  12. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 BastardFromHell в том-то и и дело что нельзя юзать окно. Потому как не обходимо блокировать перекрытие окон а также несанкционированное закрытие окна.
    т.е. тут системку пишу - антивинлокер и там необходимо именно этот функционал. Потому как винлокеры часто убивают активное окно или поверх всех окон постоянно ставят себя.