PDA

Ver la Versión Completa : Bloquear Teclas en XP


syul
04-08-2003, 02:36:02
Desarrollando una aplicación Delphi para un cyber café,
me encontré con la necesidad de bloquear el acceso
a las computadoras, cosa que ya he logrado en maquinas con Win98 y WinMe
con el truco del screen saver:

SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @dummy, 0);

En XP el tema se complica un poco más y lo mejor que encontré hasta ahora
es esta página:

http://guille.costasol.net/API/deshabilitarAltTab.asp

pero esta en Visual Basic! : (


El codigo de abajo es una traducción a Delphi que estoy intentando.
Me base un poco (o bastante) en el truco 408 de trucomania (http://www.q3.nu/trucomania/truco.cgi?408&esp).

La idea es que a traves del .dll que genera este codigo se instala un hook en Windows
que detecta pulsaciones del teclado y permite bloquerlas.

Este código funciona bien, menos el par de condiciones if que sigue al comentario
"// Si se pulsa Ctrl+Esc", condiciones que todavia no fueron traducidas.

Digo funciona bien porque basta con comentariar estos "ifs" y ver como todas las teclas y
combinaciones ,menos CTRL+ALT+DEL, son bloqueadas.

library Hook;

uses Windows, Messages;

type
tagKBDLLHOOKSTRUCT = record
vkCode: DWORD; // virtual key code
scanCode: DWORD; // scan code
flags: DWORD; // flags
time: DWORD; // time stamp for this message
dwExtraInfo: DWORD; // extra info from the driver or keybd_event
end;

const
WH_KEYBOARD_LL = 13;

var
mHook : HHook;

function LLKeyBoardProc(code : Integer;
wParam : WPARAM;
lParam : LPARAM
) : LRESULT; stdcall;
var
pkbhs : tagKBDLLHOOKSTRUCT;
ret : Longint;
begin
ret := 0;

// Copiamos el parámetro en la estructura
CopyMemory(@pkbhs, @lParam, SizeOf(pkbhs));

if code = HC_ACTION then begin
// Si se pulsa Ctrl+Esc
if pkbhs.vkCode = VK_ESCAPE then begin
if GetAsyncKeyState(VK_CONTROL) And &H8000 then begin
ret := 1;
end;
end;
end;

if ret = 0 Then begin
ret := CallNextHookEx(mHook, code, wParam, lParam);
end;

Result := ret;
end;

procedure HookOn; stdcall;
begin
mHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyBoardProc, HInstance , 0);
end;

procedure HookOff; stdcall;
begin
UnhookWindowsHookEx(mHook);
end;

exports HookOn, HookOff;

begin
end.



Para utilizar el .dll creado falta un .dpr mas con un formulario que en
su OnCreate cargue el .dll, cargue HookOn y HookOff y ejecute HookOn y en
su OnDestroy ejecute HookOff y descargue el .dll. (Ver http://www.q3.nu/trucomania/truco.cgi?408&esp)

roman
04-08-2003, 06:43:56
Hace no mucho escribí código para bloquear estas teclas con código muy parecido al que pones pero sin necesidad del dll. Funciona para Windows2000 y, según alguien comentó, también en WindowsXP. Si te interesa puedes ver el código en el siguiente enlace

hooks.pas (http://www.clubdelphi.com/users/roman/hooks.htm)

// Saludos

syul
10-08-2003, 01:18:45
Que buen pedazo de código! Funciona simplemente bien.
Lo probé en XP Profesional y todo bien.
Agradecido eternamente...
(Lo de la necesidad de dll:confused:
supongo que la documentación que viene con Delphi esta
bastante desactualizada)

jgarcia01
06-11-2006, 21:04:26
Que buen pedazo de código! Funciona simplemente bien.
Lo probé en XP Profesional y todo bien.
Agradecido eternamente...
(Lo de la necesidad de dll:confused:
supongo que la documentación que viene con Delphi esta
bastante desactualizada)



necesito que alguien me ayude con el bloqueo del teclado para Win Xp, la direccion que da Roman ya no esta disponible y tengo que hacer esto para una aplicacion de ciber cafe.

roman
06-11-2006, 21:09:03
Prueba aquí:

http://romansg.net/index.php?pg=hooks

// Saludos

jgarcia01
21-11-2006, 20:49:53
Prueba aquí:

http://romansg.net/index.php?pg=hooks

// Saludos

Roman disculpa mi falta de conocimiento, no soy mu experto en la materia de programar en delphi, pero lo importante es que quiero aprender, no se como usar el codigo que me estas mostrando en el enlace que me distes, copie el codigo y lo coloque en una unidad que llame bloqueodeteclas pero no se como llamar a esta unidad para que me funcione en el programa, necesito de tu ayuda o alguien que me pueda orientar.

Saludos y gracias anticipadas.

dec
22-11-2006, 06:54:53
Hola,

Una vez incluída la unidad en tu proyecto, su utilización es bastante sencilla. Se trata de ejecutar el procedimiento "SetHook", a modo de preparación, y a continuación llamar al procedimiento "LockKey" tantas veces como te sea menester, esto es, como dice en la ayuda de la unidad "Hook.pas" el propio Román:


LockKey(lkAltEsc, true);


Para deshabilitar la combinación de teclas "ALT + ESC". Obviamente la llamada a dicho procedimiento ha de hacerse luego de hacer inicializado el "Hook", que ya he comentado que puede hacerse, sencillamente, llamando al procedimiento "SetHook" antes de llamar a "LockKey".

Para habilitar de nuevo una combinación de teclas basta con que llames a "LockKey" indicando la combinación y, esta vez, pasando como segundo parámetro el valor "false":


LockKey(lkAltEsc, false);


No tendrás que llamar explícitamente al procedimiento "ReleaseHook", que vendría a ser el "contrario" a "SetHook", puesto que este se llama en la cláusula "finalization" de la propia unidad "Hook.pas".


{...}
finalization
ReleaseHook;
end.


Puedes usar, por ejemplo, el evento "OnCreate" de tu formulario principal para llamar al procedimiento "SetHook". A ver si el siguiente código te da alguna idea:


unit UfrmPrincipal;

interface

uses
Forms, Classes, Controls, StdCtrls;

type
TfrmPrincipal = class(TForm)
btnHabilitar: TButton;
btnDeshabilitar: TButton;
procedure FormCreate(Sender: TObject);
procedure btnHabilitarClick(Sender: TObject);
procedure btnDeshabilitarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

uses
UHooks; // Unidad UHooks.pas

procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
UHooks.SetHook; // Establecemos el "hook" de teclado
end;

procedure TfrmPrincipal.btnDeshabilitarClick(Sender: TObject);
begin
// Deshabilitamos la combinación ALT + F4
UHooks.LockKey(lkAltF4, true);
end;

procedure TfrmPrincipal.btnHabilitarClick(Sender: TObject);
begin
// Habilitamos la combinación ALT + F4
UHooks.LockKey(lkAltF4, false);
end;

end.

jgarcia01
23-11-2006, 23:18:15
Ok funciona muy bien en win xp y 2000, ya lo probe y esta muy bueno, gracias a Roman y a Dec por su apoyo, pero te permite el bloqueo de ciertas teclas, alt + tab y otras, pero para ctrl + alt + supr no lo hace y se en mi aplicacion se hace imprecindible realizar este bloqueo de teclas, si tienen alguna ayuda al respecto de esto, o si Roman tiene alguna modificacion de su programa se lo sabria agradecer.

Saludos y gracias anticipadas.

roman
23-11-2006, 23:25:02
Pues no, no hay manera. Windows 2000 y XP protegen muy bien esa combinación de teclas interceptándola desde el arranque del SO, aún antes de la identificación del usuario, por lo que no hay nada que pueda hacerse. Bueno, sí la hay pero es muy compleja y propensa a errores porque debes reemplazar la dll que maneja la identificación de usuarios (gina.dll) por una propia, y aunque está documentado como hacerlo, no parece tarea sencilla, al menos requiere de mucha paciencia.

No obstante, yo preguntaría, ¿por qué consideras que es imprescindible tal bloqueo? La más de las veces, lo que importa bloquear se puede hacer con directivas del mismo S.O, por ejemplo, el acceso al administrador de tareas.

Si nos dices qué es lo que quieres evitar, quizá te podamos dar alguna idea.

// Saludos

jgarcia01
24-11-2006, 13:16:13
bueno quizas el termino imprescindible no fue el mas adecuado, lo que realmente quiero Roman es evitar que algún usuario teclee esta combinación (Ctrl + Alt + Supr) y aparezca la pantalla de dialogo de seguridad de windows donde esta el administrador de tareas y otros mas, eso es lo que realmente quiero. si existe algún metodo por lo menos de evitar que aparezca eso aunque no se desactiven estas teclas tambien me sirve.

Saludos y gracias anticipadas.

roman
24-11-2006, 17:53:52
Es lo que te digo, no puedes evitar que aparezca esa pantalla pero sí puedes inhabilitar las opciones que ahí aparecen. Tales opciones son:


Cambiar contraseña
Bloquear equipo
Administrador de tareas
Cerrar sesión
Apagar


Todas ellas se inhabilitan con las correspondientes políticas en el registro de Windows.

Las tres primeras se colocan en la clave

HKCU\Software\Microsoft\Windows\Current\Version\Policies\System

y son (valores DWORD)


DisableChangePassword - 1
DisableLockWorkstation - 1
DisableTaskMgr - 1


Las dos últimas se colocan en la clave

HKCU\Software\Microsoft\Windows\Current\Version\Policies\Explorer

y son (valores DWORD)


NoLogoff - 1
NoClose -1


Puedes hacerte una pequeña aplicación que escriba estas entradas o bien puedes usar directamente el editor de políticas: gpedit.msc

// Saludos

jgarcia01
24-11-2006, 18:07:44
Gracias Roman por tu explicacion, bloqueare las opciones que me indicas y cualquier ayuda que necesite te estare molestando nuevamente.

Saludos.

jsc
14-08-2011, 09:37:05
Prueba aquí:

http://romansg.net/index.php?pg=hooks

// Saludos

este hilo me es de gran ayuda y agradeceria si alguien pudiera decirme la manera de llegar a bloquear el teclado. no encontre el codigo en la url que se indica arriba

basicamente me interesaria bloquear el teclado y raton para mi aplicacion delphi de manera que quede protegida, pero que se pudiera hacer uso del teclado y raton en el pc en general; dicho de otra manera, que se pueda andar en el pc pero no en la aplicación delphi
es posible?
gracias de antemano

escafandra
17-08-2011, 11:25:59
Bloquear el teclado y el ratón no es muy buena idea. ¿No será mejor que tu aplicación sea un servicio?

De cualquier forma, te muestro como realizar el bloqueo:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
public
end;

var
Form1: TForm1;
WHookKeyboard: HHOOK = 0;
WHookMouse: HHOOK = 0;

implementation

{$R *.dfm}
function KeyboardHook(Code, wParam, lParam: Integer): Integer; stdcall;
begin
if (Code = HC_ACTION) then
Result:= -1
else Result:= CallNextHookEx(WHookKeyboard, Code, wParam, lParam);
end;

function MouseHook(Code, wParam, lParam: Integer): Integer; stdcall;
var
Point: TPoint;
begin
if(Code = HC_ACTION) then
begin
GetCursorPos(Point);
ScreenToClient(Form1.Handle, Point);
if PtInRect(Form1.GetClientRect, Point) then
begin
Result:= -1;
exit;
end;
end;
Result:= CallNextHookEx(WHookMouse, Code, wParam, lParam);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
WHookKeyboard:= SetWindowsHookEx(2{WH_KEYBOARD}, @KeyboardHook, HInstance, GetCurrentThreadId);
WHookMouse:= SetWindowsHookEx(7{WH_MOUSE}, @MouseHook, HInstance, GetCurrentThreadId);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(WHookKeyboard);
UnhookWindowsHookEx(WHookMouse);
end;

end.


Saludos.

DarKraZY
17-08-2011, 12:21:33
basicamente me interesaria bloquear el teclado y raton para mi aplicacion delphi de manera que quede protegida

Quizás te pueda servir mostrar un formulario en modo ShowModal. De esta manera no se podrá acceder al resto de la aplicación.

Saludos!