![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запретить запись с экрана [D7, WinXP]
Игорь Андреевич © (2009-09-30 12:47:00)Мне нужно сделать так, что бы при выполнении программы не было возможности сделать скриншот экрана и запретить запись происходящего на экране (тоесть что бы всякие frapsы и т.д. не работали)
DVM (2009-10-01 13:54:00) [41]
> нужно в onCreate формы писать?
Категорически не нужно это писать в onCreate формы!!! В этот момент форма уже есть, а десктопа нет уже. Готовое окно нельзя перекинуть на другой десктоп насколько я знаю. Окно надо создавать на этом десктопе.
Я же сверху привел рабочий код, создай новый проект, создай новый модуль, сохрани модуль с именем десктоп и вставь первым в uses в файле проекта. В самом модуле напиши все что у меня в примере.
Игорь Андреевич (2009-10-01 13:50:00) [42]так
> initialization
> SetDesktop;
нужно в onCreate формы писать?
DVM (2009-10-01 13:47:00) [43]
> это мы создаем рабочий стол с именем mydesk
да
> SetThreadDesktop(hDsk);
Устанавливаем десктоп основному потоку нашего приложения. Иначе свое окно мы там не увидим.
> SwitchDesktop(hDsk);
Переключаемся на этот десктоп и видим там свое окно.
> CloseDesktop(hDsk);
Закрваем хендл. Сам десктоп продолжает жить.
> initialization
> SetDesktop;
>
Это нужно чтобы десктоп к моменту создания нашего окна уже был создан.
Игорь Андреевич (2009-10-01 13:41:00) [44]
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 (2009-10-01 13:34:00) [45]
> Игорь Андреевич (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.
Проверки на результаты функций вставь сам.
Игорь Андреевич (2009-10-01 13:28:00) [46]Это очень хорошая идея, спасибо! Мне и не нужно ничего кроме моего изображения на весь экран. Это будет упрощенный чертеж проекта кухни. При чем сделаю так, что посмотреть на него можно будет только 1 раз.
А вы не могли бы более подробно рассказать? Или показать пример создания второго рабочего стола и как заставить программу вывести свое окно именно на него?
DVM (2009-10-01 13:19:00) [47]
> Игорь Андреевич (01.10.09 13:14) [10]
> типа как при появлении окна выключения все замирает?
Ничего при этом не замирает. Сверху ложится окно на весь экран, которое содержит скриншот рабочего стола и медленно его обесцвечивает.
> Игорь Андреевич (01.10.09 13:14) [10]
Можно попробовать запускать твою программу на отдельном десктопе, т.е. программа при запуске создает десктоп и на него переключается, там же происходит работа с ней. Это затруднит снятие скриншотов, т.к. они обычно снимаются с десктопа основного. Правда там не будет и проводника и вообще ничего. Даже диспетчер задач там не будет отображаться (он будет на основном десктопе, по крайней мере в XP так было раньше).
Игорь Андреевич (2009-10-01 13:14:00) [48]Я понял, спасибо. Скажите тогда пожалуйста, как можно усложнить процесс снятия? Максимум до чего я додумался, это во время запуска программы, таймером с интервалом 1 полностью чистить буфер обмена (защита от всяких printscreen и т.д.).
А возможно ли сделать так, что бы программа запускалась и вся машина замирала, типа как при появлении окна выключения все замирает? Может есть какой-то глобальный freez или че-то в этом духе
miek (2009-10-01 10:03:00) [49]Можно затруднить снятие скриншота (но только под winXP/win95), если контролировать сообщение WM_PAINT/WM_PRINT. И товарищи правильно говорят - 100% гарантии нет и не будет. Если пользователь видит изображение, его можно будет снять и программно.
DVM (2009-10-01 00:54:00) [50]
> 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
DVM (2009-10-01 00:51:00) [51]
> DaysBetweenInt (30.09.09 22:49) [6]
> Но без проблем можно определить, что программа работает
> под виртуальной машиной и соответственно ...
Не думаю, что без проблем.
DaysBetweenInt (2009-09-30 22:49:00) [52]> Можно запустить твою программу вместе с ОС под виртуальной
> машиной, типа VMWare и сделать скриншот. И никто не сможет
> запретить.
Но без проблем можно определить, что программа работает под виртуальной машиной и соответственно ...
DVM (2009-09-30 22:38:00) [53]
> Игорь Андреевич (30.09.09 12:47)
>
> Мне нужно сделать так, что бы при выполнении программы не
> было возможности сделать скриншот экрана и запретить запись
> происходящего на экране (тоесть что бы всякие frapsы и т.
> д. не работали)
Можно запустить твою программу вместе с ОС под виртуальной машиной, типа VMWare и сделать скриншот. И никто не сможет запретить.
Sapersky (2009-09-30 15:25:00) [54]http://www.delphimaster.net/view.php?folder=60&file=3-1217268666
[24]
Дмитрий (2009-09-30 14:00:00) [55]... самый простой способ не увидеть ничего на экране - ничего не выводить на экран, нет изображения - нет проблемы ...
Медвежонок Пятачок (2009-09-30 13:13:00) [56]> не было возможности сделать скриншот экрана
Всегда будет такая возможность.
>и запретить запись происходящего на экране
Запретить можно.
Только запрет проигнорируют.
brother (2009-09-30 13:04:00) [57]если коротко - невыполнимо...