Pbm HOOK_CBT

lastpixl Messages postés 56 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 16 février 2006 - 23 janv. 2004 à 21:05
lastpixl Messages postés 56 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 16 février 2006 - 23 janv. 2004 à 21:36
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

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 janv. 2004 à 21:22
HInst = hinst; ne mettre que sur:
case DLL_PROCESS_ATTACH

ShowMessage("HCBT_SYSCOMMAND"); ça fait quoi ? Si tu affiches une fenetre en MessageBox ou un truc de ce genre faut pas chercher plus loin, c'est la boucle infinie.

Tu peux aller voir mes exemples, si je me souviens le limiteur de fenetres IE en version 2 se sert de ce hook.
ciao...
BruNews, Admin CS.
0
lastpixl Messages postés 56 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 16 février 2006
23 janv. 2004 à 21:36
Merci je vais voir ca...

Mais il me semble que ca plantait aussi lorsque jecrivais vers un fichier...

Quand je mets le ShowMessage (=Messagebox, on entend une fois le son et apres processseur utilisé à 100%->boucle infinie).

Merci,
Lastpix'l.
0
Rejoignez-nous