[HOOK]Encore le meme probleme..

bdkiller Messages postés 55 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 7 décembre 2004 - 9 nov. 2003 à 00:25
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 10 nov. 2003 à 09:14
Salut,

Bon, après pas mal d'heures passés là-dessus, j'ai la DLL qui se compile sans erreurs, l'appli principale qui se compile sans erreurs également!! Super, génial!! Pas d'erreurs = signe de progression 8) Mais bon, j'ai toujours un problème.. ca ne marche pas!!

Je file voir le code, ca ce trouve j'ai encore fait des conneries:

Code de la DLL:
#include <stdio.h>
#include <vcl.h>
#include <windows.h>
#include "wkh.h"
#pragma hdrstop

// VARIABLES GLOBALES

static HHOOK gos_kbdHK;
static HINSTANCE hDLL;

// FONCTIONS USUELLES ( DECLARATION )
void Logkbd(int code, WPARAM *wParam,LPARAM lParam);

// FONCTIONS USUELLES ( DEFINITION )
void
Logkbd(int code, WPARAM *wParam,LPARAM lParam)
{
  //Definitions des commandes de WinAMP
  #define WINAMP_PREV 40044
  #define WINAMP_PLAY 40045
  #define WINAMP_PAUSE 40046
  #define WINAMP_STOP 40047
  #define WINAMP_NEXT 40048
  #define WINAMP_VOLUME_UP 40058
  #define WINAMP_VOLUME_DOWN 40059

  //on trouve WinAMP
  //"v1.x" on peux mettre "v2.x", mais
  //c'est la question de compatibilité
  HWND winamp = FindWindow("Winamp v1.x", 0);

  LPMSG pMsg=(LPMSG)lParam; 
  if (pMsg->message == WM_KEYDOWN) 
    { 
    if ((pMsg->wParam == VK_F8)) 
      { 
       SendMessage(winamp,WM_COMMAND,WINAMP_PLAY,0);
      }
    }
}

// DEFINITION DES FONCTION DE FILTRE

LRESULT CALLBACK kbdHookProc(int code, WPARAM wParam, LPARAM lParam)
{
if(! ( (DWORD)lParam & 0x40000000))
return CallNextHookEx(gos_kbdHK,code,wParam,lParam);

Logkbd(code,&wParam,lParam);

return CallNextHookEx(gos_kbdHK,code,wParam,lParam);
}

_declspec(dllexport) bool SetkbdHook()
{
gos_kbdHK = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)kbdHookProc,hDLL,0);
return( (gos_kbdHK != 0) ? 1:0);
}

_declspec(dllexport) void UnSetkbdHook()
{
UnhookWindowsHookEx(gos_kbdHK);
}

BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpVoid)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
hDLL = hInstance;
break;

case DLL_PROCESS_DETACH:
UnSetkbdHook();
break;

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}


Bon, j'ai fait les définitions et tout le bordel pour trouver la fenêtre de WinAMP, j'ai laissé la touche F8 pour faire au moins un test, voir si ca marche.. Je compile la DLL - pas de problèmes, aucun warning, ni error.. je suis content, je me dis que ca va marcher je passe au code de l'appli..

Code de l'appli:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#include "Main.h"
#include "stdafx.h"

#pragma hdrstop
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TMainForm *MainForm;

typedef bool (*SKH) (void);
typedef void (*USKH) (void);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
SKH skh;
        USKH uskh;

HMODULE hDLL;

        char DLLname[256]  = "wkh.dll";

        char toaff[1024];

        if(!(hDLL = LoadLibrary(DLLname)))
{
  wsprintf(toaff,"Impossible de charger %s\nL'application va se términer",DLLname);
  MessageBox(NULL,toaff,"ERREUR FATALE",MB_OK);
  return 0;
}

skh = (SKH) GetProcAddress(hDLL,"SetkbdHook");
if( !skh ) MessageBox(NULL,"Impossible de charger la fonction exportee SetkbdHook()","ERREUR",MB_OK);
else
{
    bool res = skh();
if( ! res ) MessageBox(NULL,"Impossible de définir les Hooks clavier....","ERREUR",MB_OK);
}

MessageBox(NULL,"Appuyez sur OK pour terminer le processus","INFO",MB_OK | MB_ICONINFORMATION);

uskh = (USKH) GetProcAddress(hDLL,"UnSetkbdHook");
if (uskh) uskh();
FreeLibrary(hDLL);

return 0;
}                
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}                         
//----------------------------------------------------------------------------


Bon, la compilation du prog s'effectue correctement, pas de warnings, ni errors.. le prog se lance.. et je ne vois même pas de messages définis (en cas ou la DLL se chargerait pas, afficher nia nia nia erreure), là j'suis super content, je me dis: ca y est! c'est fait, wow! Je m'apprete à appuier sur la touche F8 pour tester play.. et là.. (vous imaginez moi en train de bouffer mes doigts et tirer mes cheveux) :cry:

Voilà voilà.. je sais pas il est ou le problème ici??! Tout se compile pafaitement, mais rien qui marche!! wouaaaaaaa!!
Sérieusement, quelqu'un peut-il résoudre ce problème?! Car je suis dessus dépuis déjà pas mal de temps, jour et nuit et je n'arrive à rien.. :roll: Je dois être un gros noOb de chez noobs.. mais bon, je vous prie de m'aider:

AU SECOURS

En attendant une réponse,
ZiKO.

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2003 à 11:47
Je te corrigerais bien ton prog mais je bosse sur VS...
C'est bien un hook systeme global que tu veux et non local de ton prog, on est d'accord.
Alors si oui procede ainsi:
Tu vires GetProcAddress etc de ton exe, tu lies la dll avec un h et un lib.
Exporte une func d'initialisation du hook depuis la dll et une pour stopper, tout doit se traiter en interne. Prends aussi l'habitude d'exporter en __stdcall et extern "C".
BruNews, ciao...
0
bdkiller Messages postés 55 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 7 décembre 2004
9 nov. 2003 à 16:29
Merci pour ta réponse, mais.. regarde:

Le header de la dll:
LRESULT CALLBACK kbdHookProc(int, WPARAM, LPARAM);

extern "C"
{
_declspec(dllexport) bool SetkbdHook();
_declspec(dllexport) void UnSetkbdHook();
}


Je sais pas quel hook, vu que je m'y connais pas - je ne vois pas de difference local, global.. Il me faut juste que quand je joue, pouvoir controller winamp sans faire ALT-TAB pour sortir du jeu..

Sur le forum de developpez.com quelqu'un m'as repondu en me disant qu'il fait virrer ceci de la dll:
case DLL_PROCESS_DETACH:
UnSetkbdHook();
break;
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2003 à 16:40
Je pense aussi que ce n'est pas sa place car sur un hook global cela serait appele pour chaque processus finissant.
C'est au prog ayant cree le hook de l'enlever, et cela depuis l'exe qui doit appeler la fonction exportee par la dll a cet effet.
BruNews, ciao...
0
bdkiller Messages postés 55 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 7 décembre 2004
9 nov. 2003 à 20:43
je comprends le fonctionnement maintenant un peu mieux.. les evenements lors des appuis sont dans la dll, dll installe le hook.. mais je ne sais pas mettre tout ca en oeuvre.. :(
tu peux pas me corriger mon code stp?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2003 à 20:54
Il me faudrait le but exact de cette dll, je prefere l'ecrire moi meme que corriger, c'est moins long.
BruNews, ciao...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2003 à 22:52
Je t'ai fait exemple complet, DLL + exe avec boutons pour hook et unhook.
Mon exemple insere la date dans la 1ere fenetre Notepad trouvee (je n'ai pas WinAmp) quand on appuie sur F8. Simplement suffit d'envoyer F5 sur la Notepad.
Je pose exemple en source, tu iras prendre.
BruNews, ciao...
0
bdkiller Messages postés 55 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 7 décembre 2004
10 nov. 2003 à 00:46
Merci beacoup! Je vais voir la source.
Le but de la DLL et/ou de prog:

Prog se lance, je lance aussi WinAmp. Ensuite je lance mon jeu, donc mon prog part en arrière plan, mais il surveille l'appui sur la touche F8 pour lancer la lecture à winamp, tout en arrière plan (car le jeu est en premier plan).
0
bdkiller Messages postés 55 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 7 décembre 2004
10 nov. 2003 à 01:07
Superbe source BruNews! Merci beacoup! J'ai testé et ça marche parfaitement, ce que j'ai besoin!!

Juste une petite question:

Comment dans ce cas:
if(wParam != VK_F8)

mettre des "macros", du style VK_MENU + 41 ?

Merci encore milliard de fois!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 nov. 2003 à 09:14
Combinaisons de touche, tu dois tester GetAsyncKeyState ou GetKeyState.
BruNews, ciao...
0
Rejoignez-nous