Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как запретить Alt-CTRL-DEL


Автор: Zero 24.1.2005, 17:13
Вообщем САБЖ. Только не направляйте на ФАКУ, я там уже смотрел, вот этот пример
Код

var  
 i : integer;  
begin  
 i := 0;  
{запрещаем Ctrl-Alt-Del}  
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @i, 0);  
end.  
// необходим unit WinProcs
// для Alt-Tab: SPI_SETFASTTASKSWITCH
не работает у меня на W'XP. Точнее компилится, но на ALT-CTRL-DEL, всё равно открывается диспетчер задач.
Да и в том числе желательно запретить любые попытки свернуть программу, или закрыть.

Автор: Pakshin A. S. 24.1.2005, 17:17
А через поиск? тама есть неплохое решение специально для ХР....

Автор: Zero 25.1.2005, 02:05
Где? Я видал одно решение, оно тоже не работает. Может покажеш ссылку...

Автор: ДЫМ 25.1.2005, 02:12
Код

//********************
// Отключение диспетчера задач в WindowsXP
//
//
//
procedure DisableTaskMgr(bTF: Boolean);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;

reg.OpenKey('Software', True);
reg.OpenKey('Microsoft', True);
reg.OpenKey('Windows', True);
reg.OpenKey('CurrentVersion', True);
reg.OpenKey('Policies', True);
reg.OpenKey('System', True);

if bTF = True then
begin
  reg.WriteString('DisableTaskMgr', '1');
end
else if bTF = False then
begin
  reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;
end;

// Example Call:
procedure TForm1.Button1Click(Sender: TObject);
begin
DisableTaskMgr(True);
end;


Автор: Zero 25.1.2005, 02:25
ДЫМ спасибо!!! А ты где это нашёл? (скинь ссылку плиз, если это из топиков форума) Не знаешь как ещё ALT-TAB запретить? И всё что может искуственно остановить приложение...
Добавлено @ 02:26
Блин, а как его теперь включить?

Автор: Zero 25.1.2005, 02:37
А всё, последнее уладил. Как Alt-Tab, отключить.

Автор: Nicholas 25.1.2005, 13:09
Цитата(Zero @ 25.1.2005, 02:37)
А всё, последнее уладил. Как Alt-Tab, отключить.


Alt-Tab я запретил, а как запретить Ctrl+Ecs????????? И еще клавиша Windows есть!

Короче мне панель задач надо заблокировать????

Автор: Snowy 25.1.2005, 13:19
Ну так просто сделай ее невидимой и все...

Автор: Zero 25.1.2005, 15:04
Цитата(Nicholas @ 25.1.2005, 13:09)
Alt-Tab я запретил,
Покажи пример плиз!!!

Автор: Akella 25.1.2005, 16:02
Находишь окно и посылаешь ему сообщение
Имя окна не помню

Автор: Ripper 25.1.2005, 16:35
Дык.... можно и без реестра. Есть способ. В факе в DRKB есть статья как стать невидимым в NT.
вот что я давно находил на форуме:
Код

library Hide;

uses
Windows,
TlHelp32;

type

SYSTEM_INFORMATION_CLASS = (
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
);


_IMAGE_IMPORT_DESCRIPTOR = packed record
case Integer of 0:(
Characteristics: DWORD);
1:(
OriginalFirstThunk:DWORD;
TimeDateStamp:DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD);
end;
IMAGE_IMPORT_DESCRIPTOR=_IMAGE_IMPORT_DESCRIPTOR;
PIMAGE_IMPORT_DESCRIPTOR=^IMAGE_IMPORT_DESCRIPTOR;

PFARPROC=^FARPROC;


const ImagehlpLib = 'IMAGEHLP.DLL';

function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool;
DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external ImagehlpLib name 'ImageDirectoryEntryToData';

function AllocMem(Size: Cardinal): Pointer;
begin
GetMem(Result, Size);
FillChar(Result^, Size, 0);
end;


procedure ReplaceIATEntryInOneMod(pszCallerModName:Pchar;pfnCurrent:FarProc;pfnNew:FARPROC;hmodCaller:hModule);
var ulSize:ULONG; pImportDesc:PIMAGE_IMPORT_DESCRIPTOR;pszModName:PChar;
 pThunk:PDWORD; ppfn:PFARPROC;ffound:LongBool;written:DWORD;
begin
pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then exit;
while pImportDesc.Name<>0 do
begin
pszModName := PChar(hmodCaller + pImportDesc.Name);
if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
Inc(pImportDesc);
end;
if (pImportDesc.Name = 0) then exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^<>0 do
begin
ppfn := PFARPROC(pThunk);
fFound := (ppfn^ = pfnCurrent);
if (fFound) then
 begin
  VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written);
  WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
  exit;
 end;
Inc(pThunk);
end;
end;

var
addr_NtQuerySystemInformation:Pointer;
mypid:DWORD;
fname:PCHAR;
mapaddr:PDWORD;
hideOnlyTaskMan:PBOOL;

{ By Wasm.ru}
function myNtQuerySystemInfo(SystemInformationClass:SYSTEM_INFORMATION_CLASS;SystemInformation:Pointer;
      SystemInformationLength:ULONG;ReturnLength:PULONG):LongInt;stdcall;
label onceagain,getnextpidstruct,quit,fillzero;
asm
push ReturnLength
push SystemInformationLength
push SystemInformation
push dword ptr SystemInformationClass
call dword ptr [addr_NtQuerySystemInformation]
or eax,eax
jl quit
cmp SystemInformationClass,SystemProcessesAndThreadsInformation
jne quit
onceagain:
mov esi,SystemInformation
getnextpidstruct:
mov ebx,esi
cmp dword ptr [esi],0
je quit
add esi,[esi]
mov ecx,[esi+44h]
cmp ecx,mypid
jne getnextpidstruct
mov edx,[esi]
test edx,edx
je fillzero
add [ebx],edx
jmp onceagain
fillzero:
and [ebx],edx
jmp onceagain
quit:
mov Result,eax
end;


procedure InterceptFunctions;
var hSnapShot:THandle;me32:MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod('ntdll.dll',addr_NtQuerySystemInformation,@MyNtQuerySystemInfo,me32.hModule);
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;

procedure UninterceptFunctions;
var hSnapShot:THandle;me32:MODULEENTRY32;
begin
addr_NtQuerySystemInformation:=GetProcAddress(getModuleHandle('ntdll.dll'),'NtQuerySystemInformation');
hSnapShot:=CreateToolHelp32SnapShot(TH32CS_SNAPMODULE,GetCurrentProcessId);
if hSnapshot=INVALID_HANDLE_VALUE then exit;
try
ZeroMemory(@me32,sizeof(MODULEENTRY32));
me32.dwSize:=sizeof(MODULEENTRY32);
Module32First(hSnapShot,me32);
repeat
ReplaceIATEntryInOneMod('ntdll.dll',@MyNtQuerySystemInfo,addr_NtQuerySystemInformation,me32.hModule);
until not Module32Next(hSnapShot,me32);
finally
CloseHandle(hSnapShot);
end;
end;


var HookHandle: THandle;

function CbtProc(code: integer; wparam: integer; lparam: integer):Integer; stdcall;
begin
Result:=0;
end;

procedure InstallHook; stdcall;
begin
HookHandle:=SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
end;

var hFirstMapHandle:THandle;

function HideProcess(pid:DWORD;HideOnlyFromTaskManager:BOOL):BOOL;stdcall;
var addrMap:PDWORD;ptr2:PBOOL;
begin
mypid:=0;
result:=false;
hFirstMapHandle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,8,'NtHideFileMapping');
if hFirstMapHandle=0 then exit;
addrMap:=MapViewOfFile(hFirstMapHandle,FILE_MAP_WRITE,0,0,8);
if addrMap=nil then
begin
CloseHandle(hFirstMapHandle);
exit;
end;
addrMap^:=pid;
ptr2:=PBOOL(DWORD(addrMap)+4);
ptr2^:=HideOnlyFromTaskManager;
UnmapViewOfFile(addrMap);
InstallHook;
result:=true;
end;


exports
HideProcess;

var
hmap:THandle;

procedure LibraryProc(Reason: Integer);
begin
if Reason=DLL_PROCESS_DETACH then
if mypid>0 then
UninterceptFunctions() else
CloseHandle(hFirstMapHandle);
end;


begin
hmap:=OpenFileMapping(FILE_MAP_READ,false,'NtHideFileMapping');
if hmap=0 then exit;
try
mapaddr:=MapViewOfFile(hmap,FILE_MAP_READ,0,0,0);
if mapaddr=nil then exit;
mypid:=mapaddr^;
hideOnlyTaskMan:=PBOOL(DWORD(mapaddr)+4);
if hideOnlyTaskMan^ then
begin
fname:=allocMem(MAX_PATH+1);
GetModuleFileName(GetModuleHandle(nil),fname,MAX_PATH+1);
// if not (ExtractFileName(fname)='taskmgr.exe') then exit;
end;
InterceptFunctions;
finally
UnmapViewOfFile(mapaddr);
CloseHandle(Hmap);
DLLProc:=@LibraryProc;
end;
end.




А вот пример проги, с испольщованием hide.dll:
Код

program HideProj;


uses
windows,messages;

function HideProcess(pid:DWORD;HideOnlyFromTaskManager:BOOL):BOOL; stdcall; external 'hide.dll';

function ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
begin
 Result := True;
 if Msg.Message <> WM_QUIT then
 begin
   Handled := False;
   begin
     TranslateMessage(Msg);
     DispatchMessage(Msg);
   end;
 end
end;
end;

procedure ProcessMessages;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do {loop};
end;


begin
HideProcess(GetCurrentProcessId,false);
while true do
begin
ProcessMessages;
end;
end.


HideProcess(GetCurrentProcessId,false); - одной строкой прячеш когда надо. А в реестре навсегда останется.. надо после зварешения проги восстановлять все записи. У меня этот код работал .. я точно помню smile

Автор: Akella 25.1.2005, 16:37
мне кажется после установки SP1 или SP2 нормально работать не будет

Автор: Ripper 25.1.2005, 16:50
Щас на буттон повесил HideProcess(GetCurrentProcessId,false);
и работало тока на кнопку тыркнул а потом на окошко с CAD ) И надпись project1.exe пропала smile
У меня SP2 стоит

Автор: Ripper 25.1.2005, 19:03
Кстати, вопрос заключается в том чтобы не появлялся диспетчер задач или в том как спрятать программу из дичпетчера?) Это разные вещи)

Автор: Zero 25.1.2005, 19:12
Цитата(Ripper @ 25.1.2005, 19:03)
Кстати, вопрос заключается в том чтобы не появлялся диспетчер задач или в том как спрятать программу из дичпетчера?)

Вопрос заключался, "Как сделать чтобы на ALT-TAB, ничего не происходило"
И ещё <Windows>+D, тоже надо чтобы отключить.

Автор: Ripper 26.1.2005, 06:02
Ну хз.... может с помощью хуков? Поищи на форуме
Я помню что записывал нажатия клавиш хуками. вроде как можно отловить и другие клавиши. хотя хз... насчет СaD первый пример хорошо подходит

Автор: Zero 27.1.2005, 01:49
Поднимаю тему. Только тут дополнение, не ALT-CTRL_DEL, т.к. это сделано, а ALT-TAB, точнее как его запретить для Windows'XP.

Автор: ДЫМ 27.1.2005, 03:07
А может hook на клавиатуру? Сам я в этом не силен, но знающие люди, думаю, подскажут.

Автор: Akella 27.1.2005, 11:38
Мне кажется, что все эти клавиши и сочетания можно отключить в реестре или в политиках

Автор: Akella 27.1.2005, 11:52
зависит, конечно от ОС

Автор: Bes 27.1.2005, 12:36
Если задача - спрятать программу, (а я так думаю, задача именно такая):
1) Не подозрительно ли будет отсутствие таких замечательных клавиш? :-)
2) чтобы убрать прогу отовсюду (кроме диспетчера задач, где можно подобрать красивое имя типа "ntkernel32" чтобы руки не чесались закрыть) надо свойство Application.showmainform:=false;
3) идеальный вариант прицепляться к другим процессам типа explorer.exe только я так не пробовал

Автор: Zero 27.1.2005, 18:03
Цитата(dsergey @ 27.1.2005, 11:38)
Мне кажется, что все эти клавиши и сочетания можно отключить в реестре или в политиках

dsergey а ты не знаешь, какой ключь надо использовать.
Цитата(dsergey @ 27.1.2005, 11:52)
зависит, конечно от ОС

W'XP+SP2
Добавлено @ 18:04
Да, <Windows>+D тоже бы надо обрать как-нибудь.

Автор: W_A_K_E 30.1.2005, 01:29
У меня такой компонент был просто ставишь его на форму и настраиваешь параметры невидимости
У меня был пока жесткий не полетелsmile...
Извени название не помню

А еще в виде паса на какомто сайте валялся...

Автор: ДЫМ 30.1.2005, 05:37
Если надо просто отключить клавишу Windows Logo в приложении, то вот, что я придумал. Проверял, - работает железно. smile

Выставляем KeyPreview=True
Код


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
// если нажали Windows Logo эмулируем нажатие Esc
if Key in [VK_LWIN,VK_RWIN]  then  keybd_event(VK_ESCAPE, 1, 0, 0);
end;


Если надо запретить реакцию на Win+D, то делаем так:
кидаем на форму ApplicationEvents, и пишем обработчик события OnDeactivate
Код

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  ShowWindow(Form1.Handle,SW_SHOW);
  SetForegroundWindow(Form1.Handle);
end;


Вдобавок можно отменить реакцию на минимизацию формы
(взято из DRKB)
Код


type
 TForm1 = class(TForm)
...
private
   { Private declarations }
   procedure WMSysCommand(var Msg: TWMSysCommand);
   message WM_SYSCOMMAND;
 public
   { Public declarations }
 end;
...

procedure TForm1.WMSysCommand;
begin
 if (Msg.CmdType <> SC_MINIMIZE) then inherited;
end;



Автор: Zero 30.1.2005, 13:40
Цитата
Если надо запретить реакцию на Win+D, то делаем так:
кидаем на форму ApplicationEvents, и пишем обработчик события OnDeactivate

ДЫМ а я когда на форму кидаю ApplicationEvents, то у меня появляется такое:
Код

procedure TForm1.ApplicationEvents1ActionExecute(Action: TBasicAction;
 var Handled: Boolean);
begin

end;

Точнее сказать ApplicationEvents1ActionExecute, а не ApplicationEvents1Deactivate
И кстати, мне нужно именно запретить Win+D, а не для отдельных прог, чтобы не работала.

Автор: ДЫМ 31.1.2005, 05:15
Цитата

ДЫМ а я когда на форму кидаю ApplicationEvents, то у меня появляется такое:
Код 
Код


procedure TForm1.ApplicationEvents1ActionExecute(Action: TBasicAction;
var Handled: Boolean);
begin

end;  


Точнее сказать ApplicationEvents1ActionExecute, а не ApplicationEvents1Deactivate


Если я правильно понял, то ты дважды кликаешь на ApplicationEvents1, вот и появляется обработчик OnActionExecute. Надо в инспекторе объектов найти строчку OnDeactivate, на вкладке Events и кликать на ней.

А вообще-то, еще та оказалась задачка. Попробовал последнее средство - поставил глобальный хук на клавишу Windows и сочетание Win+D.

Одиночное нажатие блокируется начисто (что тоже немало), но для Win+D происходит следующее:
сначала все окна сворачиваются, а затем событие уже попадает в мою ловушку.
Выходит, что по-любому система сама сначала обрабатывает комбинацию Win+D, и только затем событие передается в ловушку.

Единственное, что можно сделать, так это восстановить все окна после нажатия Win+D. Получается такое мигание, сначала все сворачивается, а затем восстанавливается. Вот код:

Ловушка

Код

library DisableKey;

uses
 SysUtils,
 Classes,
 Windows,
 Messages;

const
{handle для ловушки}
 HookHandle: hHook = 0;

function Key_Hook(Code: integer; wParam: word;
 lParam: Longint): Longint; stdcall; export;

begin
 case wParam of
  // Клавиша 'D'
  68:
   // если одновременно нажаты клавиши Windows
   if (GetKeyState(VK_LWIN)<1) or (GetKeyState(VK_RWIN)<1) then
      // эмулируем нажатие 'D' (все окна снова восстанавливаются)
      keybd_event(68, 1, 0, 0);
  // одиночные нажатия клавиш Windows
  VK_LWIN,VK_RWIN:
     //эмулируем нажатие Esc
     keybd_event(VK_ESCAPE, 1, 0, 0);
 end;//case

 Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

procedure Hook(lRun:Boolean); export; stdcall;
begin
if lRun then
 HookHandle:=SetWindowsHookEx(WH_KEYBOARD,@Key_Hook,HInstance,0)
else
 begin
  UnhookWindowsHookEx(HookHandle);
  HookHandle:=0;
 end;
end;

exports Hook;

begin
end.



А это вызов Dll в модуле формы

Код


...

implementation

{$R *.dfm}

// Ловушка
procedure Hook(lRun:Boolean) stdcall; external 'DisableKey' name 'Hook';


procedure TForm1.FormCreate(Sender: TObject);
begin
// устанавливаем ловушку
Hook(True);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// отключаем ловушку
Hook(False);
end;
...


Цитата

dsergey

Мне кажется, что все эти клавиши и сочетания можно отключить в реестре или в политиках 



Вот еще почитай (только работает это кажется после перезагрузки) :

Цитата

Запрещение горячих клавиш с Windows Logo

В конце статьи я приведу недокументированную системную политику, отключающую использование горячих клавиш Windows, которая поддерживается в Windows 9.x, Millenium, 2000 и XP.
Эта системная политика блокирует обработку клавиши "Windows Logo" в горячих клавишах. Однако после того как эта политика будет активизирована, одиночное нажатие клавиши "Windows Logo", которое вызывает меню "Пуск", будет отрабатываться. Также, необходимо отметить, что с этой включенной политикой нажатие "Windows Logo" в комбинациях клавиш будет игнорироваться, остальные нажатия будут обрабатываться как обычно.
Для ее активизации необходимо создать параметр "NoWinKeys" типа DWORD в следующей ветви системного реестра: "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" и установить его значение в 1. Установка параметра "NoWinKeys" в 0 или его отсутствие отключает политику.
Этот параметр может храниться в реестре Windows как в разделе HKEY_CURRENT_USER, так и в разделе HKEY_LOCAL_MACHINE и иметь область действия либо на весь "Компьютер" (Local Machine), либо на "Текущего пользователя" (Current User) соответственно.
Политика, имеющая область действия весь "Компьютер", хранящаяся в разделе системного реестра HKEY_LOCAL_MACHINE имеет приоритет над, политикой хранящейся в разделе HKEY_CURRENT_USER и имеющей область действия "Текущего пользователя".






Автор: Zero 31.1.2005, 10:47
Спасибо!!! Понял.

Автор: ДЫМ 5.2.2005, 02:19
Посмотри сюда

http://forum.vingrad.ru/index.php?showtopic=41584

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)