Конференция "WinAPI" » Запретить запись с экрана [D7, WinXP]
 
  • Игорь Андреевич (30.09.09 12:47) [0]
    Мне нужно сделать так, что бы при выполнении программы не было возможности сделать скриншот экрана и запретить запись происходящего на экране (тоесть что бы всякие frapsы и т.д. не работали)
  • brother © (30.09.09 13:04) [1]
    если коротко - невыполнимо...
  • Медвежонок Пятачок © (30.09.09 13:13) [2]
    > не было возможности сделать скриншот экрана
    Всегда будет такая возможность.

    >и запретить запись происходящего на экране
    Запретить можно.
    Только запрет проигнорируют.
  • Дмитрий (30.09.09 14:00) [3]
    ... самый простой способ не увидеть ничего на экране - ничего не выводить на экран, нет изображения - нет проблемы ...
  • Sapersky (30.09.09 15:25) [4]
  • DVM © (30.09.09 22:38) [5]

    > Игорь Андреевич   (30.09.09 12:47)
    >
    > Мне нужно сделать так, что бы при выполнении программы не
    > было возможности сделать скриншот экрана и запретить запись
    > происходящего на экране (тоесть что бы всякие frapsы и т.
    > д. не работали)

    Можно запустить твою программу вместе с ОС под виртуальной машиной, типа VMWare и сделать скриншот. И никто не сможет запретить.
  • DaysBetweenInt (30.09.09 22:49) [6]
    > Можно запустить твою программу вместе с ОС под виртуальной
    > машиной, типа VMWare и сделать скриншот. И никто не сможет
    > запретить.

    Но без проблем можно определить, что программа работает под виртуальной машиной и соответственно ...
  • DVM © (01.10.09 00:51) [7]

    > DaysBetweenInt   (30.09.09 22:49) [6]


    > Но без проблем можно определить, что программа работает
    > под виртуальной машиной и соответственно ...

    Не думаю, что без проблем.
  • DVM © (01.10.09 00:54) [8]

    > DaysBetweenInt   (30.09.09 22:49) [6]

    Скажу больше. Во-первых это справедливо только для некоторых виртуальных машин, вот для той же VMWare. Во-вторых это недокумнтированные методы и соответственно точто работает сейчас может перестать работать в след версии машины. А виртуальных машин вагон и маленькая тележка:
    http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD
  • miek (01.10.09 10:03) [9]
    Можно затруднить снятие скриншота (но только под winXP/win95), если контролировать сообщение WM_PAINT/WM_PRINT. И товарищи правильно говорят - 100% гарантии нет и не будет. Если пользователь видит изображение, его можно будет снять и программно.
  • Игорь Андреевич (01.10.09 13:14) [10]
    Я понял, спасибо. Скажите тогда пожалуйста, как можно усложнить процесс снятия? Максимум до чего я додумался, это во время запуска программы, таймером с интервалом 1 полностью чистить буфер обмена (защита от всяких printscreen и т.д.).

    А возможно ли сделать так, что бы программа запускалась и вся машина замирала, типа как при появлении окна выключения все замирает? Может есть какой-то глобальный freez или че-то в этом духе
  • DVM © (01.10.09 13:19) [11]

    > Игорь Андреевич   (01.10.09 13:14) [10]


    > типа как при появлении окна выключения все замирает?

    Ничего при этом не замирает. Сверху ложится окно на весь экран, которое содержит скриншот рабочего стола и медленно его обесцвечивает.


    > Игорь Андреевич   (01.10.09 13:14) [10]

    Можно попробовать запускать твою программу на отдельном десктопе, т.е. программа при запуске создает десктоп и на него переключается, там же происходит работа с ней. Это затруднит снятие скриншотов, т.к. они обычно снимаются с десктопа основного. Правда там не будет и проводника и вообще ничего. Даже диспетчер задач там не будет отображаться (он будет на основном десктопе, по крайней мере в XP так было раньше).
  • Игорь Андреевич (01.10.09 13:28) [12]
    Это очень хорошая идея, спасибо! Мне и не нужно ничего кроме моего изображения на весь экран. Это будет упрощенный чертеж проекта кухни. При чем сделаю так, что посмотреть на него можно будет только 1 раз.

    А вы не могли бы более подробно рассказать? Или показать пример создания второго рабочего стола и как заставить программу вывести свое окно именно на него?
  • DVM © (01.10.09 13:34) [13]

    > Игорь Андреевич   (01.10.09 13:28) [12]

    PrintScreen на новом десктопе кстати работает. И потом изображение из буфера обмена можно забрать. Придется еще чистить буфер или как то блокировать PrintScreen там. Само же создание десктопа несложно, вот:

    program Project1;
    uses
     desktop in 'desktop.pas',  // обязательно первым!!!
     Forms,
     Unit1 in 'Unit1.pas' {Form1};
    {$R *.res}
    begin
     Application.Initialize;
     Application.CreateForm(TForm1, Form1);
     Application.Run;
    end.

    unit desktop;

    interface

    implementation

    uses
     windows;

    procedure SetDesktop;
    var
     hDsk: THANDLE;
    begin
     hDsk := CreateDesktop('mydesk',nil,nil,0,
                       DESKTOP_READOBJECTS or DESKTOP_CREATEWINDOW  or DESKTOP_CREATEMENU  or
                       DESKTOP_HOOKCONTROL or DESKTOP_JOURNALRECORD or DESKTOP_JOURNALPLAYBACK or
                       DESKTOP_ENUMERATE or DESKTOP_WRITEOBJECTS or DESKTOP_SWITCHDESKTOP,
                       nil);
     SetThreadDesktop(hDsk);
     SwitchDesktop(hDsk);
     CloseDesktop(hDsk);
    end;

    initialization
     SetDesktop;
    end.



    Проверки на результаты функций вставь сам.
  • Игорь Андреевич (01.10.09 13:41) [14]
    hDsk := CreateDesktop('mydesk',nil,nil,0,
                      DESKTOP_READOBJECTS or DESKTOP_CREATEWINDOW  or DESKTOP_CREATEMENU  or
                      DESKTOP_HOOKCONTROL or DESKTOP_JOURNALRECORD or DESKTOP_JOURNALPLAYBACK or
                      DESKTOP_ENUMERATE or DESKTOP_WRITEOBJECTS or DESKTOP_SWITCHDESKTOP,
                      nil);


    это мы создаем рабочий стол с именем mydesk

    SetThreadDesktop(hDsk);
    SwitchDesktop(hDsk);



    что означают эти функции? Догадываюсь, что одна из них переключает, а вторая?

    CloseDesktop(hDsk);



    это нужно вставить в form.onClose ? Что бы закрыть созданный рабочий стол перед выходом из мое программы?

    initialization
    SetDesktop;



    не могу вкурить что это

    Обьясните плииз)
  • DVM © (01.10.09 13:47) [15]

    > это мы создаем рабочий стол с именем mydesk

    да


    > SetThreadDesktop(hDsk);

    Устанавливаем десктоп основному потоку нашего приложения. Иначе свое окно мы там не увидим.


    > SwitchDesktop(hDsk);

    Переключаемся на этот десктоп и видим там свое окно.


    > CloseDesktop(hDsk);

    Закрваем хендл. Сам десктоп продолжает жить.


    > initialization
    > SetDesktop;
    >

    Это нужно чтобы десктоп к моменту создания нашего окна уже был создан.
  • Игорь Андреевич (01.10.09 13:50) [16]
    так
    > initialization
    > SetDesktop;

    нужно в onCreate формы писать?
  • DVM © (01.10.09 13:54) [17]

    > нужно в onCreate формы писать?

    Категорически не нужно это писать в onCreate формы!!! В этот момент форма уже есть, а десктопа нет уже. Готовое окно нельзя перекинуть на другой десктоп насколько я знаю. Окно надо создавать на этом десктопе.

    Я же сверху привел рабочий код, создай новый проект, создай новый модуль, сохрани модуль с именем десктоп и вставь первым в uses в файле проекта. В самом модуле напиши все что у меня в примере.
  • DVM © (01.10.09 13:56) [18]

    > Игорь Андреевич   (01.10.09 13:50) [16]

    Создание десктопа должно происходить до создания объекта Application (так как в нем тоже есть окно скрытое) и надежнее всего десктоп создавать и переключаться на него при инициализации модуля.
  • Игорь Андреевич (01.10.09 14:01) [19]
    Спасибо, работает)) А как при закрытии формы вернуться обратно? А то у меня воллпейпер на весь экран и все)) Ни на что не реагирует))
 
Конференция "WinAPI" » Запретить запись с экрана [D7, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0.002]