![]() |
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) |
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 |
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) |
Cita:
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. |
|
Cita:
Saludos y gracias anticipadas. |
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:
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":
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".
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:
|
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. |
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 |
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. |
Es lo que te digo, no puedes evitar que aparezca esa pantalla pero sí puedes inhabilitar las opciones que ahí aparecen. Tales opciones son:
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)
Las dos últimas se colocan en la clave HKCU\Software\Microsoft\Windows\Current\Version\Policies\Explorer y son (valores DWORD)
Puedes hacerte una pequeña aplicación que escriba estas entradas o bien puedes usar directamente el editor de políticas: gpedit.msc // Saludos |
Gracias Roman por tu explicacion, bloqueare las opciones que me indicas y cualquier ayuda que necesite te estare molestando nuevamente.
Saludos. |
Cita:
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 |
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:
Saludos. |
Cita:
Saludos! |
La franja horaria es GMT +2. Ahora son las 06:52:09. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi