Lo primero muchas gracias, como siempre rapidísimos.
Este es el código:
Código:
library HookTeclado;
{
Demo de Hook de teclado a nivel de sistema, Radikal.
Como lo que queremos es capturar las teclas pulsadas en cualquier parte
de Windows, necesitamos instalar la funcion CallBack a la que llamará
el Hook en una DLL, que es ésta misma.
}
uses
Windows,
Messages;
const
CM_MANDA_TECLA = WM_USER + $1000;
var
HookDeTeclado : HHook;
FicheroM : THandle;
PReceptor : ^Integer;
function CallBackDelHook( Code : Integer;
wParam : WPARAM;
lParam : LPARAM
) : LRESULT; stdcall;
{Esta es la funcion CallBack a la cual llamará el hook.}
{This is the CallBack function called by he Hook}
begin
{Si una tecla fue pulsada o liberada}
{if a key was pressed/released}
if code=HC_ACTION then
begin
{Miramos si existe el fichero}
{if the mapfile exists}
FicheroM:=OpenFileMapping(FILE_MAP_READ,False,'ElReceptor');
{Si no existe, no enviamos nada a la aplicacion receptora}
{If dont, send nothing to receiver application}
if FicheroM<>0 then
begin
PReceptor:=MapViewOfFile(FicheroM,FILE_MAP_READ,0,0,0);
PostMessage(PReceptor^,CM_MANDA_TECLA,wParam,lParam);
UnmapViewOfFile(PReceptor);
CloseHandle(FicheroM);
end;
end;
{Llamamos al siguiente hook de teclado de la cadena}
{call to next hook of the chain}
Result := CallNextHookEx(HookDeTeclado, Code, wParam, lParam)
end;
procedure HookOn; stdcall;
{Procedure que instala el hook}
{procedure for install the hook}
begin
HookDeTeclado:=SetWindowsHookEx(WH_KEYBOARD, @CallBackDelHook, HInstance , 0);
end;
procedure HookOff; stdcall;
begin
{procedure para desinstalar el hook}
{procedure to uninstall the hook}
UnhookWindowsHookEx(HookDeTeclado);
end;
exports
{Exportamos las procedures...}
{Export the procedures}
HookOn,
HookOff;
begin
end.
Ésta la unit Hook, a ponr en el uses de la aplicación:
Código Delphi
[-]
unit Hooks;
interface
type
TLockableKey = (lkAltTab, lkAltEsc, lkCtrlEsc, lkAltF4, lkWin, lkApps, lkAlt);
procedure SetHook;
procedure ReleaseHook;
procedure LockKey(Key: TLockableKey; Lock: Boolean);
implementation
uses
Windows, Dialogs;
const
WH_KEYBOARD_LL = 13;
LLKHF_ALTDOWN = $20;
LLKHF_CTRLDOWN = $8000;
type
PKbdHookInfo = ^TKbdHookInfo;
TKbdHookInfo = record
VkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
ExtraInfo: DWORD;
end;
var
Hook: HHook;
Keys: set of TLockableKey;
function KbdHook(Code: Integer; WParam, LParam: DWORD): HHook; stdcall;
var
VkCode: DWORD;
AltDown: Boolean;
CtrlDown: Boolean;
begin
if Code = HC_ACTION then
begin
VkCode := PKbdHookInfo(LParam).VkCode;
AltDown := PKbdHookInfo(LParam).Flags and LLKHF_ALTDOWN <> 0;
CtrlDown := GetAsyncKeyState(VK_CONTROL) and LLKHF_CTRLDOWN <> 0;
if (lkAlt in Keys) then
begin
Result := 1;
exit;
end;
end;
Result := CallNextHookEx(Hook, Code, WParam, LParam);
end;
procedure SetHook;
begin
Hook := SetWindowsHookEx(WH_KEYBOARD_LL, @KbdHook, HInstance, 0);
end;
procedure ReleaseHook;
begin
if Hook <> 0 then UnhookWindowsHookEx(Hook);
end;
procedure LockKey(Key: TLockableKey; Lock: Boolean);
begin
if Lock then Include(Keys, Key) else Exclude(Keys, Key);
end;
initialization
Hook := 0;
Keys := [];
finalization
ReleaseHook;
end.
En su día, casi sabía el cómo funcionaba, vosotros lo veréis mejor y me diréis, si como dice JXJ, lo puedo poner en un procedure, aunque no se como.
Os diré para que es, me he hecho un editor de texto, poniendo cosas de un sitio y de otro, pues bien, ágil, que se diga, no soy con el teclado, así que de vez en cuando, poco antes de salvar lo escrito, 'tocaba alguna tecla', no se cual, 'alt' 'ctrl' o las dos a la vez, el caso es que me salía del editor y perdía todo lo escrito, que muchas veces escribía lo que salía de mi mente, cómo una carta, no era copiar, total, un cabreo y a pensar otra vez y a escribir.
Con ésta dll, cada vez que daba a alguna tecla 'rara', me salía un mensaje: 'tecla inválida' le daba a ok y listo, a continuar.
Si hay otra forma más sencilla, agradecería la información.
Supongo que la dll es de Club delphi.
Espero, que como explicación, sirvan los códigos.
Nuevamente gracias.
Un saludo.
Tonio