J'ai essayé de mettre un en place un hook CBT comme pour les autres types de hooks, mais à chaque fois quand je lance le programme il me plante mon envoronnement de developpement (BCB5).
La source plus bas est le code d'un DLL, qui est loadé par un autre exe, qui appelle la fonction InitHook, puis EndHook quand il se quitte.
Est-ce que quelqu'un pourrait m'expliquer pourquoi ca plante ?
Merci, Lastpix'l.
//Source
#include <stdio.h>
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "LMCONS.H" // pour UNLEN
#pragma argsused
#include <windows.h>
void _export InitHook(HWND hDest);
void _export EndHook();
HHOOK CBTHookHandle;
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);
// fonction d'initialisation de la DLL
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
HInst = hinst;
switch (reason)
{
case DLL_PROCESS_ATTACH : // à la création de l'instance de la DLL
break;
case DLL_PROCESS_DETACH : // au détachement de la DLL
break;
default :
break;
}
return 1;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void _export InitHook(HWND hDest) // _export est spécifique à BCB
{
CBTHookHandle = SetWindowsHookEx(WH_CBT, // Créer un hook sur le clavier
(HOOKPROC)CBTProc, // Utiliser la fonction KeybdProc
HInst, // Dans la DLL d'instance HInst
0); // Pour tous les threads
}
void _export EndHook()
{
UnhookWindowsHookEx(CBTHookHandle);
}
LRESULT CALLBACK _export CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CHAR szBuf[128];
CHAR szCode[128];
if (nCode < 0) // do not process message
return CallNextHookEx(CBTHookHandle, nCode, wParam,
lParam);
switch (nCode)
{
case HCBT_ACTIVATE:
ShowMessage("HCBT_ACTIVATE");
break;
case HCBT_CLICKSKIPPED:
ShowMessage("HCBT_CLICKSKIPPED");
break;
case HCBT_CREATEWND:
ShowMessage("HCBT_CREATEWND");
break;
case HCBT_DESTROYWND:
ShowMessage("HCBT_DESTROYWND");
break;
case HCBT_KEYSKIPPED:
ShowMessage("HCBT_KEYSKIPPED");
break;
case HCBT_MINMAX:
ShowMessage("HCBT_MINMAX");
break;
case HCBT_MOVESIZE:
ShowMessage("HCBT_MOVESIZE");
break;
case HCBT_QS:
ShowMessage("HCBT_QS");
break;
case HCBT_SETFOCUS:
ShowMessage("HCBT_SETFOCUS");
break;
case HCBT_SYSCOMMAND:
ShowMessage("HCBT_SYSCOMMAND");
break;
default:
ShowMessage("Unknown");
break;
}
return CallNextHookEx(CBTHookHandle, nCode, wParam,
lParam);
}
//---------------------------------------------------------------------------
//END SOURCE