Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Блокировка Windows   Найти похожие ветки 

 
m2003 ©   (2004-06-25 20:32) [0]

Хочу сделать программу которая будет запускаться вместо Explorer"а и все действия будут выполняться через неё. Сложность заключается в том что я не знаю как сделать так чтоб нельзя было делать никаких действий не через программу - то есть нужно чтоб она блокировала Windows. Например в Windows 2000 можно из TaskManager запустить программу - это не приемлемо.
Заранее спасибо.


 
DrPass ©   (2004-06-26 00:58) [1]

Запрети запуск TaskManager


 
m2003 ©   (2004-06-26 08:29) [2]

как?


 
DillerXX ©   (2004-06-26 09:55) [3]

В настройках доступа пользователя. Запрети потом все горячие клавиши, и при появлении окна Осла (если вдруг умный чел), прихлопывай тут же его...


 
Alternative   (2004-06-26 17:35) [4]

ДиллерХХ, кто такой "Осел"?


 
Игорь Шевченко ©   (2004-06-26 18:52) [5]


> Хочу сделать программу которая будет запускаться вместо
> Explorer"а и все действия будут выполняться через неё.


Сделай ее со своим Desktop"ом


 
m2003 ©   (2004-06-27 08:36) [6]

я хотел сказать что все действия будут выполнятся через неё и ТОЛЬКО через неё. Как это сделать?


 
DrPass ©   (2004-06-27 15:11) [7]


> Сделай ее со своим Desktop"ом

От TaskManager это не спасет. А запретить запуск тех или иных программ можно в политиках безопасности ("Управление компьютером" в папке "Администрирование")


 
Cardinal ©   (2004-06-27 18:10) [8]

По-моему все "затыкнуть" нельзя: все-равно найдется лазейка.
Пример: http://amis.h11.ru/story1.htm


 
m2003 ©   (2004-06-27 22:44) [9]

Что делать будем?


 
Игорь Шевченко ©   (2004-06-27 23:02) [10]

DrPass ©   (27.06.04 15:11)


> От TaskManager это не спасет


Я тоже заблуждался. DVM (с) прислал программу с примером того, что спасет.


 
m2003 ©   (2004-06-28 08:19) [11]

2 Игорь Шевченко:
Дайте нам посмотреть.


 
DVM ©   (2004-06-28 15:04) [12]


> m2003 ©  


> Например в Windows 2000 можно из TaskManager запустить программу
> - это не приемлемо.

Так подправь таскменеджер. Возьми Restorator и удали у него там кнопку "Новая задача" и меню. И в Safe Mode положи подправленный вариант его на место исходного.
Это легче, чем разбираться с Десктопами.
То же надо сделать с остальными "дырявыми программами".

Что до десктопов, то надо создать свой десктоп и переключиться на него. Там на этом десктопе не будет ничего, кроме окна твоей программы. Таскменеджер же будет открываться, но он будет открываться на прежний дефолтовый десктоп и будет создаваться иллюзия, что Ctrl+Alt+Del не работают.
Кода у меня сейчас нет, найду потом напишу - длинный он.


 
DrPass ©   (2004-06-28 15:54) [13]


> Таскменеджер же будет открываться, но он будет открываться
> на прежний дефолтовый десктоп и будет создаваться иллюзия,
> что Ctrl+Alt+Del не работают

Тогда впролне логичный вопрос - а другие программы тоже будут на прежний декстоп открываться?


 
Игорь Шевченко ©   (2004-06-28 16:26) [14]

DVM ©   (28.06.04 15:04)

Если я выложу твой код, возражений не будет ?


 
DVM ©   (2004-06-28 17:37) [15]


> Если я выложу твой код, возражений не будет ?

Да ради бога, Игорь. Только там в конце он покоцанный, его чуть подправить надо.

> Тогда впролне логичный вопрос - а другие программы тоже
> будут на прежний декстоп открываться?

Те, что запущены уже на этом новом десктопе на новый. Старые, запущенные ранее, все остануться на старом.


 
Игорь Шевченко ©   (2004-06-28 17:40) [16]

Файл: DesktopShell.dpr

program DesktopShell;

uses
 Windows, Messages, Classes, SysUtils, ShellAPI, StdCtrls, Dialogs, Forms;

{$R *.res}

const
 C_ClubDesktop = "ClubDesktop!";

type
 TTest = class(TComponent)
   procedure Close(Sender: TObject);
   procedure Open(Sender: TObject);
 end;

 TSwitchDesktopThread = class(TThread)
 private
   FDesk: HDESK;
 protected
   procedure Execute; override;
 public
   constructor Create(ADesk: HDESK);
 end;

var
 Form: TForm;
 Test: TTest;

function GetDesktopName(ADesk: HDESK): string;
var
 lpnLengthNeeded: Cardinal;
 pvInfo: PChar;
begin
 result := "";
 pvInfo := nil;
 GetUserObjectInformation(ADesk, UOI_NAME, pvInfo, 0, lpnLengthNeeded);
 pvInfo := StrAlloc(lpnLengthNeeded);
 try
   if GetUserObjectInformation(ADesk, UOI_NAME, pvInfo, lpnLengthNeeded,
       lpnLengthNeeded) then
     SetString(result, pvInfo, lpnLengthNeeded-1);
 finally
   StrDispose(pvInfo);
 end;
end;

function IsClubDesktop: boolean;
var
 hObj: HDESK;
begin
 hObj := GetThreadDesktop(GetCurrentThreadId);
 result := GetDesktopName(hObj) = C_ClubDesktop;
end;

procedure CreateClubDesktop;
var
 hObj: HDESK;
begin
 hObj := CreateDesktop(C_ClubDesktop, nil, nil, DF_ALLOWOTHERACCOUNTHOOK,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_HOOKCONTROL or
   DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS, nil);
 if hObj = 0 then
   raise Exception.Create(SysErrorMessage(GetLastError));
end;

procedure StartClubShell;
var
 SI: STARTUPINFO;
 PI: TPROCESSINFORMATION;
begin
 FillMemory(@SI, sizeof(SI), 0);
 FillMemory(@PI, sizeof(PI), 0);
 SI.cb := sizeof(SI);
 SI.lpDesktop := PChar("WinSta0\"+C_ClubDesktop);
 if not CreateProcess(PChar(Application.ExeName), nil, nil, nil, false,
     NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, nil, SI, PI) then
   raise Exception.Create(SysErrorMessage(GetLastError));
end;

function SwitchDesktopExt(ADesk: HDESK): Boolean;
begin
 with TSwitchDesktopThread.Create(ADesk) do
   try
     WaitFor;
     Result := Boolean(ReturnValue);
   finally
     Free;
   end;
end;

procedure ShowClubDesktop;
var
 hObj: HDESK;
begin
 hObj := OpenDesktop(C_ClubDesktop, DF_ALLOWOTHERACCOUNTHOOK, true,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_HOOKCONTROL or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or
   DESKTOP_WRITEOBJECTS);
 SwitchDesktopExt(hObj);
 CloseDesktop(hObj);
end;

procedure ShowDefaultDesktop;
var
 hObj: HDESK;
begin
 hObj := OpenDesktop("Default", DF_ALLOWOTHERACCOUNTHOOK, true,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_HOOKCONTROL or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or
   DESKTOP_WRITEOBJECTS);
 SwitchDesktopExt(hObj);
 CloseDesktop(hObj);
end;

{ TTest }

procedure TTest.Close(Sender: TObject);
begin
 Form.Close;
end;

procedure TTest.Open(Sender: TObject);
begin
 with TOpenDialog.Create(nil) do
   try
     if Execute then
       ShellExecute(Form.Handle,"open",PChar(FileName),nil,nil,SW_SHOW);
   finally
     Free;
   end;
end;

{ TSwitchDesktopThread }

constructor TSwitchDesktopThread.Create(ADesk: HDESK);
begin
 inherited Create(false);
 FDesk := ADesk;
end;

procedure TSwitchDesktopThread.Execute;
begin
 ReturnValue := Integer(false);
 if SetThreadDesktop(FDesk) then
   if SwitchDesktop(FDesk) then
     ReturnValue := Integer(false);
end;

begin
 Application.Initialize;
 if IsClubDesktop then begin
   Application.CreateForm(TForm, Form);
   Test := TTest.Create(Form);
   with TButton.Create(Form) do begin
     Parent:=Form;
     Visible:=true;
     Caption := "Close";
     SetBounds(10,10,100,20);
     OnClick := Test.Close;
   end;
   with TButton.Create(Form) do begin
     Parent:=Form;
     Visible:=true;
     Caption := "Open";
     SetBounds(10,40,100,20);
     OnClick := Test.Open;
   end;
   Application.Run;
   Test.Free;
   ShowDefaultDesktop;
 end else begin
   CreateClubDesktop;
   StartClubShell;
   ShowClubDesktop;
 end;
end.



Страницы: 1 вся ветка

Текущий архив: 2004.08.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.034 c
8-1085246749
Dr.Alex
2004-05-22 21:25
2004.08.08
MPEG to AVI


3-1089586197
Daniil
2004-07-12 02:49
2004.08.08
Многострочный DBGrid


1-1090521455
Fagot
2004-07-22 22:37
2004.08.08
Как запретить показ любых сообщений об ошибках


4-1088589015
juiceman
2004-06-30 13:50
2004.08.08
Открытый файл


4-1088137150
RustiK
2004-06-25 08:19
2004.08.08
Получение изображения со сканера