Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запретить запись с экрана [D7, WinXP]


Страницы:   1 2 3

Игорь Андреевич ©   (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]

если коротко - невыполнимо...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо