Bueno, esto suena chistoso pero estoy cansado de que mis gatos masajeen mi teclado y he estado buscando soluciones para bloquear el teclado y que por mucho que pisen no hagan ningun estropicio. Todo lo que he encontrado por la red ha sido referente a una app que haga un hook del teclado y deseche las pulsaciones hasta que haya una combinacion de teclas deseadas o una palabra o algo asi. He escrito este codigo pero funciona a medias:
Código PHP:
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define OK -32767 //Necesario para el keylogger
LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam);
TForm1 *Form1;
HHOOK hKeyboardHook;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonColocarHookClick(TObject *Sender)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
ButtonColocarHook->Enabled = false;
ButtonQuitarHook->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonQuitarHookClick(TObject *Sender)
{
UnhookWindowsHookEx(hKeyboardHook);
ButtonColocarHook->Enabled = true;
ButtonQuitarHook->Enabled = false;
}
//---------------------------------------------------------------------------
LRESULT WINAPI KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
{
static count=0;
if( (nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)) ){
if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_SHIFT))
{
}else if(GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
{
}else if(GetAsyncKeyState(VK_CONTROL))
{
}else if(GetAsyncKeyState(VK_MENU))
{
}else if(GetAsyncKeyState(VK_SHIFT)){
}else{
if (count == 0 && tolower(*(PDWORD)lParam) == 'u') { // 'u'
count = 1;
} else if (count == 1 && tolower(*(PDWORD)lParam) == 'n') { // 'n'
count = 2;
} else if (count == 2 && tolower(*(PDWORD)lParam) == 'l') { // 'l'
count = 3;
} else if (count == 3 && tolower(*(PDWORD)lParam) == 'o') { // 'o'
count = 4;
} else if (count == 4 && tolower(*(PDWORD)lParam) == 'c') { // 'c'
count = 5;
} else if (count == 5 && tolower(*(PDWORD)lParam) == 'k') { // 'k'
count = 0;
Form1->ButtonQuitarHook->Click();
} else {
count = 0;
}
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardEvent, GetModuleHandle(NULL), 0);
ButtonColocarHook->Enabled = false;
ButtonQuitarHook->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
UnhookWindowsHookEx(hKeyboardHook);
ButtonColocarHook->Enabled = true;
ButtonQuitarHook->Enabled = false;
}
//---------------------------------------------------------------------------
Realmente capturo todas las pulsaciones que desee pero lo que deseo es que esas pulsaciones sean todas desechadas hasta que se desbloquee el teclado pero aunque las capturo no consigo anularlas. ¿podeis ayudarme con esto?