Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-08-2003
syul syul is offline
Registrado
 
Registrado: ago 2003
Ubicación: Asunción - Paraguay
Posts: 5
Poder: 0
syul Va por buen camino
Bloquear Teclas en XP

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)
Responder Con Cita
  #2  
Antiguo 04-08-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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

// Saludos

Última edición por roman fecha: 04-08-2003 a las 06:46:47.
Responder Con Cita
  #3  
Antiguo 10-08-2003
syul syul is offline
Registrado
 
Registrado: ago 2003
Ubicación: Asunción - Paraguay
Posts: 5
Poder: 0
syul Va por buen camino
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
supongo que la documentación que viene con Delphi esta
bastante desactualizada)
Responder Con Cita
  #4  
Antiguo 06-11-2006
jgarcia01 jgarcia01 is offline
Registrado
 
Registrado: nov 2006
Posts: 5
Poder: 0
jgarcia01 Va por buen camino
Cita:
Empezado por syul
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
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.
Responder Con Cita
  #5  
Antiguo 06-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Prueba aquí:

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

// Saludos
Responder Con Cita
  #6  
Antiguo 21-11-2006
jgarcia01 jgarcia01 is offline
Registrado
 
Registrado: nov 2006
Posts: 5
Poder: 0
jgarcia01 Va por buen camino
Unhappy

Cita:
Empezado por roman
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.
Responder Con Cita
  #7  
Antiguo 22-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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:

Código Delphi [-]
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":

Código Delphi [-]
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".

Código Delphi [-]
{...}
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:

Código Delphi [-]
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 23-11-2006
jgarcia01 jgarcia01 is offline
Registrado
 
Registrado: nov 2006
Posts: 5
Poder: 0
jgarcia01 Va por buen camino
Talking Bloqueo de Ctrl + Alt + Supr

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.
Responder Con Cita
  #9  
Antiguo 23-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #10  
Antiguo 24-11-2006
jgarcia01 jgarcia01 is offline
Registrado
 
Registrado: nov 2006
Posts: 5
Poder: 0
jgarcia01 Va por buen camino
Red face

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.
Responder Con Cita
  #11  
Antiguo 24-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es lo que te digo, no puedes evitar que aparezca esa pantalla pero sí puedes inhabilitar las opciones que ahí aparecen. Tales opciones son:
  1. Cambiar contraseña
  2. Bloquear equipo
  3. Administrador de tareas
  4. Cerrar sesión
  5. 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
Responder Con Cita
  #12  
Antiguo 24-11-2006
jgarcia01 jgarcia01 is offline
Registrado
 
Registrado: nov 2006
Posts: 5
Poder: 0
jgarcia01 Va por buen camino
Cool

Gracias Roman por tu explicacion, bloqueare las opciones que me indicas y cualquier ayuda que necesite te estare molestando nuevamente.

Saludos.
Responder Con Cita
  #13  
Antiguo 14-08-2011
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 21
jsc Va por buen camino
Cita:
Empezado por roman Ver Mensaje
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
Responder Con Cita
  #14  
Antiguo 17-08-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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:
Código Delphi [-]
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.

Última edición por escafandra fecha: 17-08-2011 a las 11:42:02.
Responder Con Cita
  #15  
Antiguo 17-08-2011
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Cita:
Empezado por jsc Ver Mensaje
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:51:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi