Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

Блокировка 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.033 c
10-1026384652
А. Н. Оним
2002-07-29 17:34
2004.08.08
Возврат DCOM сервером строки


11-1078141206
Чапаев
2004-03-01 14:40
2004.08.08
Создание компонентов под KOL


4-1088355244
P.N.P.
2004-06-27 20:54
2004.08.08
Изменение размеров


1-1090766637
Вопрос
2004-07-25 18:43
2004.08.08
Если выбран (focus) edit, то...


4-1088268505
Nomolos
2004-06-26 20:48
2004.08.08
Как получить количество физических жестких дисков?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский