Ciao a tutti,
l'altro giorno non sapevo cosa fare e mi sono messo a giocare con gli hook, un argomeno molto interessante ma che non ho mai approfondito.
Cosi ho tirato fuori il solito Prato Fiorito (il mio target preferito hihi) e ho partorito il codice che vedete sotto.
Ma cosa fa?
Normalmente in Prato Fiorito se premiamo il tasto F2 cominciamo una nuova partita.
Premendo F4 non succede niente.
Bene, iniettiamo questa DLL in Prato Fiorito (campo minato), da quel momento la nostra myHookProcedure intercetterà i messaggi della tastiera, in questo modo saremo in grado di controllare se è premuto il tasto F2 o il tasto F4
Con F4 usciamo dal gioco (abbiamo aggiunto una funzionalità)
Quando viene premuto F2, viene intercettato e visualizziamo un messaggi (MessageBox), dopo di che controlliamo se è premuto il tasto destro del mouse, nel qual caso settiamo a true la flag call_next per assicurarci di chiamare il resto della hook chain in modo che F2 venga elaborato "normalmente" come al solito, ovvero iniziamo una partita nuova.
La cosa interessante è che se NON premiamo il pulsante, NON chiamiamo la routine originale e il tasto F2... puuf! come non fosse mai stato premuto
Questo comportamento a volte può tornare utile, basta un po' di fantasia
C++ Programming
//
// test keyboard hook
// by Digger 2011
// <a href="http://hackmix.altervista.org" target="_blank" rel="noopener" class="mycode_url">http://hackmix.altervista.org</a>
//
#include <windows.h>
#include <stdio.h>
HHOOK hHook=0;
// Questa è la nostra hook procedure
LRESULT __stdcall myHookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
bool call_next=false; // se true eseguiamo il CallNextHookEx
// controlliamo se il messaggio ci interessa o no
if ((nCode!=HC_ACTION) || ((lParam|0xFFFFFF)==0xC0FFFFFF))
call_next=true;
if (!call_next)
{
switch(wParam)
{
case VK_F2:
MessageBox(NULL,"Hook in azione!, se ora tieni premuto il tasto destro del mouse
e clicchi ok ricominci","by Digger 2011",MB_OK);
if (GetAsyncKeyState(VK_RBUTTON))
call_next=true;
break;
case VK_F4:
ExitProcess(0);
break;
}
}
if (call_next)
return CallNextHookEx(hHook,nCode,wParam,lParam);
else
return 1;
}
int DllProc()
{
bool fine=false;
HWND h=0;
DWORD thid=0;
// Cerchiamo la finestra "Prato fiorito",
// ricaviamo il threadId che l'ha creata e settiamo l'hook passandogli
// la nostra hook procedure, dopo di che restiamo qui in loop a far niente
if (h=FindWindow(NULL, "Prato fiorito"))
if (thid=GetWindowThreadProcessId(h,0))
if (hHook=SetWindowsHookEx(WH_KEYBOARD,myHookProcedure,NULL,thid))
while(true)Sleep(500);
return 0;
}
BOOL WINAPI DllMain(HINSTANCE mod, DWORD DWORD_REASON, LPVOID res)
{
switch(DWORD_REASON)
{
case DLL_PROCESS_ATTACH:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)DllProc , 0, 0, 0);
break;
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(hHook);
break;
}
return TRUE;
}