Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как можно заблокировать ситемные клавиши  (Прочитано 14102 раз)
0 Пользователей и 1 Гость смотрят эту тему.
monrus
Опытный

ru
Offline Offline

« : 24-04-2007 01:28 » 

Создаю  для себя прогу-скринлокер, которая должна блокировать ALT+CTRL+DEL, CTRL+F4, SHIFT+CTRL+ESC и пр.
Как это все организовать в ХР?
Записан
MS
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-04-2007 04:21 » 

procedure DisableTaskMgr(Disable: 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 Disable then
    reg.WriteString('DisableTaskMgr', '1') //блокиреум
  else
    reg.WriteString('DisableTaskMgr', '0'); //разблокируем
  reg.CloseKey;
end;
/// это на ALT+CTRL+DEL
Записан

Ничто так не ограничивает полёт мысли программиста, как компилятор
MS
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-04-2007 04:24 » 

Вот еще, может пригодится.

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Блокировка/Разблокировка системы.

Модуль LockSys. Блокировка/Разблокировка системы.
Метод блокировки: блокируется (по-выбору) клавиатура и мышь,
системные комбинации клавиш, или всё вместе.
БЛОКИРОВКА СИСТЕМЫ: function LockSystem(LockMode:TLockMode):Boolean;
Возможные значения параметра LockMode:
lmInput - блокировка мыши и клавитатуры
lmSystemKeys - блокировка системных комбинаций клавиш
lmBoth = lmInput + lmSystemKeys
В случае успеха функция возвращает True, иначе - False

РАЗБЛОКИРОВКА СИСТЕМЫ: function UnLockSystem(UnLockMode:TLockMode):Boolean;
Входные параметры аналогичны функции LockSystem, но только
речь в данном случае идёт о разблокировке.
В случае успеха - True, иначе - False.
===============================================

unit LockSys;

interface
uses
  Windows;

type
  TLockMode = (lmInput, lmSystemKeys, lmBoth);

function FuncAvail(_dllname, _funcname: string; var _p: pointer): boolean;
function LockSystem(LockMode: TLockMode): Boolean;
function UnLockSystem(UnLockMode: TLockMode): Boolean;

var
  xBlockInput: function(Block: BOOL): BOOL; stdcall;

implementation

function FuncAvail(_dllname, _funcname: string; var _p: pointer): boolean;
var
  _lib: tHandle;
begin
  Result := false;
  _p := nil;
  if LoadLibrary(PChar(_dllname)) = 0 then
    exit;
  _lib := GetModuleHandle(PChar(_dllname));
  if _lib <> 0 then
  begin
    _p := GetProcAddress(_lib, PChar(_funcname));
    if _p <> nil then
      Result := true;
  end;
end;

function LockSystem(LockMode: TLockMode): Boolean;
begin
  Result := False;

  if LockMode = lmSystemKeys then //Locking system
    if not SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil, 0) then
      Exit;

  if LockMode = lmInput then //locking keyb and mouse
    if FuncAvail('USER32.DLL', 'BlockInput', @xBlockInput) then
      xBlockInput(true)
    else
      Exit;

  if LockMode = lmBoth then
  begin
    if not SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, nil, 0) then
      Exit;
    if FuncAvail('USER32.DLL', 'BlockInput', @xBlockInput) then
      xBlockInput(true)
    else
      Exit;
  end;

  Result := True;
end;

function UnLockSystem(UnLockMode: TLockMode): Boolean;
begin
  Result := False;

  if UnLockMode = lmSystemKeys then //UnLocking system
    if not SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, nil, 0) then
      Exit;

  if UnLockMode = lmInput then //unlocking keyb and mouse
    if FuncAvail('USER32.DLL', 'BlockInput', @xBlockInput) then
      xBlockInput(false)
    else
      Exit;

  if UnLockMode = lmBoth then
  begin
    if not SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, nil, 0) then
      Exit;
    if FuncAvail('USER32.DLL', 'BlockInput', @xBlockInput) then
      xBlockInput(false)
    else
      Exit;
  end;

  Result := True;
end;

end.
Пример использования:

LockSystem(lmBoth); // Блокировка всей системы
UnLockSystem(lmInput); // Разблокировка клавы и мыши
Записан

Ничто так не ограничивает полёт мысли программиста, как компилятор
DemonicAlligator
Гость
« Ответ #3 : 24-04-2007 07:08 » 

Могу порекомендовать http://www.codeproject.com/useritems/GINA_SPY.asp
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 24-04-2007 07:39 » 

Эта библиотека наверно настолько достала Microsoft, что тут http://msdn2.microsoft.com/en-us/library/aa380543.aspx
есть такое примечание
Цитата
Note   GINA DLLs are ignored in Windows Vista.
Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 24-04-2007 09:40 » 

Цитата
#define BUGS=OFF
, ггг, багоделы, млин.
Записан

monrus
Опытный

ru
Offline Offline

« Ответ #6 : 24-04-2007 13:26 » 

MS, я пробовал твои примеры. По первому блокируется диспетчер задач, но обратно не разблокируется. Приходится удалять эту ветку реестра. Плюс выходит окно, что заблокировано админом.
По второму примеру ниче не выходит. Т.е. системные клавиши не блокируются. Может из-за ХР.
Gina тоже не подходит, т.к. нужно че-то прописывать в реестр. и пр.

Может есть еще какие-нить варианты?
Ты не знаешь, х77?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 24-04-2007 13:41 » 

monrus, есть только две мысли. первая - это писать глобальные хуки на клаву и мышь (но я не уверен, что они отлавливают нажатия всех функциональных клавишь).

вторая - перехват NtQuerySystemInformation, через которую винда получает инфу о твоём процессе. при желании можно сделать так, твой процесс просто не будет виден. Ctrl+Alt+Del сработает как обычно, но вот твоя прога - в нём будет не видна.

я думаю, имеет смысл прогуляться на http://drkb.ru/
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 24-04-2007 13:46 » 

в любом случае, под XP все телодвижения должны увязываться на Authority и Security дескрипторы, я не думаю, что подобная задача решается банальным писанием в реестр. если комп загрузит юзер с ограниченными правами, он просто не сможет таким вот образом заблокировать ТаскБар, это у тебя прокатило только потому, что ты на своей тачке админ Ага
Записан

monrus
Опытный

ru
Offline Offline

« Ответ #9 : 24-04-2007 16:09 » 

Так я под свою тачку пишу. Мне без разницы будет моя прога видна или нет.
Я подумал - может по таймеру отлавливать появление диспетчера задач и прочие и закрывать их.
В любом случае хуки надо написать.
Пока тема не закрыта Улыбаюсь
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 24-04-2007 16:12 » 

попробуй свою прогу назначить шелом. я не знаю, как это будет в ХР, а в 9х - эффект получался поразительный. не работало вообще нифига Улыбаюсь кроме того, конечно, что умела сама твоя прога.
Записан

monrus
Опытный

ru
Offline Offline

« Ответ #11 : 24-04-2007 16:59 » 

Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines