PDA

Ver la Versión Completa : Bloquear Teclado


jobev_lee
21-06-2004, 21:18:07
:) Hola, que tal... Espero que todo bien... aqui yo nuevito nuevito en este foro...

Bueno al grano entonces, resulta que tengo que desarrollar un proyecto de administracion de maquinas y decearia que alguien me facilitara algun codio fuente que me ayude a bloquear el teclado hasta que una aplicacion en el servidor lo habilite... he intentado usar ASM pero en XP no me chunca...

HELP

roman
21-06-2004, 21:23:08
Pienso que podrías usar un hook del teclado a nivel de sistema para bloquear toda actividad en el teclado. A reserva de que consultes la documentación (busca Hooks en la ayuda del SDK de Windows) puedes ver un ejemplo en la unidad hooks.pas (http://www.clubdelphi.com/users/roman/hooks.php) de mi página que muestra cómo instalar y desintalar un hook, cosa que harías según el mensaje que mande el servidor.

// Saludos

NeWNeO
10-07-2004, 15:08:04
Yo te puedo ayudar, pero lo que te voy a decir anula tanto el teclado como el raton.

Usaremos una función que viene en el user32.dll denominada "BlockInput", y que corta toda comunicación con los periféricos del usuario (teclado y ratón)


private
function FunctionExists(LaFunction: string;DllFile:string; var p: pointer): boolean;
// Con esta función comprobaremos la disponibilidad de la función
public
procedure SetInput(Stat: boolean); // Aquí modificaremos el estado


function TForm1.FunctionExists(LaFunction: string;DllFile:string; var p: pointer): boolean;
var
lib: THandle;
begin
Result := false;
p := NIL;
if LoadLibrary(PChar(DllFile)) = 0 then exit; // Cargamos la libreria
lib := GetModuleHandle(PChar(DllFile)); // Obtenemos el handle de la libreria
if lib <> 0 then // Si existe el handle
begin
// Obtenemos la dirección de la función que necesitamos
p := GetProcAddress(lib, PChar(LaFunction));
if p <> NIL then Result := true;
end;
end;

procedure TForm1.SetInput(Stat: Boolean);
var
xBlockInput : function(Block: BOOL): BOOL; stdcall;
begin
// Nos aseguramos que la función está disponible, la cargamos, y ejecutamos
if FunctionExists('BlockInput','USER32.DLL', @xBlockInput) then xBlockInput(Stat)
else showmessage('No se pudo cargar la función especificada');
end;



Puedes hacer pruebas poniendo un timer a 5, 10 seg... para que te desbloquee el teclado, ¡o si nos deberás reiniciar el PC!

"FunctionExists" te sirve para cargar y ejecutar cualquier proceso o función que necesites :D
Suerte

roman
11-07-2004, 00:49:31
Puedes hacer pruebas poniendo un timer a 5, 10 seg... para que te desbloquee el teclado, ¡o si nos deberás reiniciar el PC!

De hecho no será necesario reiniciar la PC. El problema con esta función es que realmente no sirve. Sí bloquea el teclado y el ratón excepto por CTRL-ALT-DEL y apenas se oprime esta combinación se restaura la actividad de teclado y ratón; al menos en la prueba que realicé en Windows XP y de acuerdo a la documentación.

// Saludos

kaiser_robert
23-06-2005, 22:40:28
bueno di uso a estos codigos pero ahora quiero que el ctrl+alt+supr tampoco lo detecten como hago gracias por sus respuestas

:rolleyes:
___________________________________________________
Al que madruga le da sueño

roman
23-06-2005, 22:53:48
En WinXP/2000 esto es mucho más difícil. Cuando arrancas Windows, lo primero en ejecutarse es WinLogon.exe quien a su vez carga una biblioteca llamada gina.dll. Esta biblioteca se encarga de todo el proceso de autenticación del usuario y "se apropia" de la combinación ctrl-alt-supr de manera que no hay tiempo de interceptarla uno mismo. Entonces, al parecer, la única manera de poder lidiar con ello es escribiendo una dll que reemplace a gina. Esto puede hacerse y está documentado en el SDK de Windows pero no es tarea fácil ya que tienes que implementar muchas funciones y tener cuidado con no bloquear el proceso normal de carga del sistema.

Ahora una pregunta por curiosidad: ¿por qué pones el icono del pulgar hacia abajo? ¿Hay algo que desapruebas?

// Saludos

DarkDrakon
13-09-2005, 01:53:16
:D :D Bueno a mi me Funciono esto en Win98:


var
dummy : integer;

{Desactivar el Ctrl-Alt-Del:}
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @dummy, 0);



Como Volver a Activarlo:


var
dummy : integer;

{Volver a Activarlo}
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, @dummy, 0);




:D Esto me Funciono para WinXP y 2000 :D

Añade Registry en el uses de tu form


procedure TForm1.Button1Click(Sender: TObject);

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 = Truethen
begin
reg.WriteString('DisableTaskMgr', '1');
end
else if bTF = False then
begin
reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;
end;

begin
//Desabilitamos el Ctrl-Alt-Del
//Disable Ctrl-Alt-Del
DisableTaskMgr (True);
end;