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)