Ver Mensaje Individual
  #6  
Antiguo 04-09-2008
Tonio Tonio is offline
Miembro
 
Registrado: may 2003
Ubicación: Logroño
Posts: 111
Reputación: 22
Tonio Va por buen camino
Borrado de una dll por antivirus

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
  { Teclas que podemos inhabilitar }
  TLockableKey = (lkAltTab, lkAltEsc, lkCtrlEsc, lkAltF4, lkWin, lkApps, lkAlt);

procedure SetHook;
procedure ReleaseHook;

procedure LockKey(Key: TLockableKey; Lock: Boolean);

implementation

uses
  Windows, Dialogs;

const
  {
    Tipo de 'gancho'

    Obsérvese que la documentación de Windows que viene
    con Delphi no incluye este 'gancho' sino únicamente
    WH_KEYBOARD que no intercepta estas teclas.
  }
  WH_KEYBOARD_LL = 13;

  { Banderas para detectar las teclas ALT y CTRL }
  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 (VkCode = VK_TAB) and AltDown and (lkAltTab in Keys) then
    begin
      Result := 1;
      exit;
    end;

    if (VkCode = VK_ESCAPE) then
    begin
      if AltDown and (lkAltEsc in Keys) then
      begin
        Result := 1;
        exit;
      end;

      if CtrlDown and (lkCtrlEsc in Keys) then
      begin
        Result := 1;
        exit;
      end;
    end;

    if (VkCode = VK_F4) and AltDown and (lkAltF4 in Keys) then
    begin
      Result := 1;
      exit;
    end;

    if ((VkCode = VK_LWIN) or (VkCode = VK_RWIN)) and (lkWin in Keys) then
    begin
      Result := 1;
      exit;
    end;

    if (VkCode = VK_APPS) and (lkApps in Keys) then
    begin
      Result := 1;
      exit;
    end; }

     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
Responder Con Cita