-
Мне нужно сделать так, что бы при выполнении программы не было возможности сделать скриншот экрана и запретить запись происходящего на экране (тоесть что бы всякие frapsы и т.д. не работали)
-
если коротко - невыполнимо...
-
> не было возможности сделать скриншот экрана Всегда будет такая возможность.
>и запретить запись происходящего на экране Запретить можно. Только запрет проигнорируют.
-
... самый простой способ не увидеть ничего на экране - ничего не выводить на экран, нет изображения - нет проблемы ...
-
-
> Игорь Андреевич (30.09.09 12:47) > > Мне нужно сделать так, что бы при выполнении программы не > было возможности сделать скриншот экрана и запретить запись > происходящего на экране (тоесть что бы всякие frapsы и т. > д. не работали)
Можно запустить твою программу вместе с ОС под виртуальной машиной, типа VMWare и сделать скриншот. И никто не сможет запретить.
-
> Можно запустить твою программу вместе с ОС под виртуальной > машиной, типа VMWare и сделать скриншот. И никто не сможет > запретить.
Но без проблем можно определить, что программа работает под виртуальной машиной и соответственно ...
-
> DaysBetweenInt (30.09.09 22:49) [6]
> Но без проблем можно определить, что программа работает > под виртуальной машиной и соответственно ...
Не думаю, что без проблем.
-
-
Можно затруднить снятие скриншота (но только под winXP/win95), если контролировать сообщение WM_PAINT/WM_PRINT. И товарищи правильно говорят - 100% гарантии нет и не будет. Если пользователь видит изображение, его можно будет снять и программно.
-
Я понял, спасибо. Скажите тогда пожалуйста, как можно усложнить процесс снятия? Максимум до чего я додумался, это во время запуска программы, таймером с интервалом 1 полностью чистить буфер обмена (защита от всяких printscreen и т.д.).
А возможно ли сделать так, что бы программа запускалась и вся машина замирала, типа как при появлении окна выключения все замирает? Может есть какой-то глобальный freez или че-то в этом духе
-
> Игорь Андреевич (01.10.09 13:14) [10]
> типа как при появлении окна выключения все замирает?
Ничего при этом не замирает. Сверху ложится окно на весь экран, которое содержит скриншот рабочего стола и медленно его обесцвечивает.
> Игорь Андреевич (01.10.09 13:14) [10]
Можно попробовать запускать твою программу на отдельном десктопе, т.е. программа при запуске создает десктоп и на него переключается, там же происходит работа с ней. Это затруднит снятие скриншотов, т.к. они обычно снимаются с десктопа основного. Правда там не будет и проводника и вообще ничего. Даже диспетчер задач там не будет отображаться (он будет на основном десктопе, по крайней мере в XP так было раньше).
-
Это очень хорошая идея, спасибо! Мне и не нужно ничего кроме моего изображения на весь экран. Это будет упрощенный чертеж проекта кухни. При чем сделаю так, что посмотреть на него можно будет только 1 раз.
А вы не могли бы более подробно рассказать? Или показать пример создания второго рабочего стола и как заставить программу вывести свое окно именно на него?
-
> Игорь Андреевич (01.10.09 13:28) [12]
PrintScreen на новом десктопе кстати работает. И потом изображение из буфера обмена можно забрать. Придется еще чистить буфер или как то блокировать PrintScreen там. Само же создание десктопа несложно, вот: program Project1;
uses
desktop in 'desktop.pas', Forms,
Unit1 in 'Unit1.pas' ;
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. Проверки на результаты функций вставь сам.
-
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; не могу вкурить что это Обьясните плииз)
-
> это мы создаем рабочий стол с именем mydesk
да
> SetThreadDesktop(hDsk);
Устанавливаем десктоп основному потоку нашего приложения. Иначе свое окно мы там не увидим.
> SwitchDesktop(hDsk);
Переключаемся на этот десктоп и видим там свое окно.
> CloseDesktop(hDsk);
Закрваем хендл. Сам десктоп продолжает жить.
> initialization > SetDesktop; >
Это нужно чтобы десктоп к моменту создания нашего окна уже был создан.
-
так > initialization > SetDesktop;
нужно в onCreate формы писать?
-
> нужно в onCreate формы писать?
Категорически не нужно это писать в onCreate формы!!! В этот момент форма уже есть, а десктопа нет уже. Готовое окно нельзя перекинуть на другой десктоп насколько я знаю. Окно надо создавать на этом десктопе.
Я же сверху привел рабочий код, создай новый проект, создай новый модуль, сохрани модуль с именем десктоп и вставь первым в uses в файле проекта. В самом модуле напиши все что у меня в примере.
-
> Игорь Андреевич (01.10.09 13:50) [16]
Создание десктопа должно происходить до создания объекта Application (так как в нем тоже есть окно скрытое) и надежнее всего десктоп создавать и переключаться на него при инициализации модуля.
-
Спасибо, работает)) А как при закрытии формы вернуться обратно? А то у меня воллпейпер на весь экран и все)) Ни на что не реагирует))
|