Форум: "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.5 MB
Время: 0.034 c