Hook CBT

Programmation d'applications complexes
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Hook CBT

Message par Ombres »

Salut :)
voila j'essaye de faire marcher ce code:

Code : Tout sélectionner

Global cbtHook.l

Procedure CbtHook(nCode,wParam,lParam)
  If nCode < 0
    ProcedureReturn CallNextHookEx_(cbtHook,nCode,wParam,lParam) 
  EndIf
  Select nCode 
    Case #HCBT_ACTIVATE
      Debug "La fenetre "+Str(wParam)+" a été activée"
    Case #HCBT_CLICKSKIPPED
      Debug "Message clic souris retiré"
    Case #HCBT_CREATEWND
      Debug "La fenetre "+Str(wParam)+" a été crée"
    Case #HCBT_DESTROYWND
      Debug "La fenetre "+Str(wParam)+" a été détruite"
    Case #HCBT_KEYSKIPPED
      Debug "Message appui de touche "+Chr(wParam)+" a été retirée"
    Case #HCBT_MINMAX
      Debug "La fenetre "+Str(wParam)+" a été réduite ou agrandie"
    Case #HCBT_MOVESIZE
      Debug "La fenetre "+Str(wParam)+" a été déplacée ou a changée de taille"
    Case #HCBT_QS
      Debug "QS... le truc qui sert a rien :p"
    Case #HCBT_SETFOCUS
      Debug "La fenetre "+Str(wParam)+" a pris le focus et la fenetre "+Str(lParam)+" l'a perdu"
    Case #HCBT_SYSCOMMAND
      Debug "Commande systeme"
    Default
      Debug "Cas pas trop possible ^^ "
  EndSelect
  ProcedureReturn 0 
EndProcedure

If OpenWindow(0,0,0,120,0,#PB_Window_SystemMenu|#PB_Window_TitleBar,"Pour quitter")=#FALSE
  MessageRequester("","Echec de la fenetre")
  End
EndIf

;Créé le hook
cbtHook = SetWindowsHookEx_(#WH_CBT,@CbtHook(),GetModuleHandle_(#NULL),0)
If cbtHook = #FALSE
  MessageRequester("","Echec du cbt")
  End
EndIf

;Attente de fermeture
Repeat : Until WaitWindowEvent() = #PB_EventCloseWindow

;Libere le cbt
UnhookWindowsHookEx_(cbtHook)
Tant que je clique sur la fenetre ou celles du debuggeur,
ca a l'air de marcher, mais quand je clique sur une autre fenetre
ca fait planter le programme qui a créé la fenetre ... 8O
Ca arrive même a faire planter le bureau ou la barre des taches...

Quelqu'un aurai une idée de pourquoi ca fait ca ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Cedravic a déjà fait planter mon système, avec toi ça fait deux :roll: :lol:

Et on dit que Window XP est plus stable....

En tout cas, c'est l'idéal pour tuer une application :)


Bon, lorsque tu fais un Hook dans une application, il ne fonctionne que pour ce processus.
Pour l'étendre à tous les processus, il faut créer le Hook dans une Dll , elle sera alors chargée dans tous les processus en cours, tu doit aussi créer une zone de mémoire partagée pour sauvegarder le Handle du Hook et autres données utiles.

Il y a un exemple en C++ ici: http://tcharles.developpez.com/simul/
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Message par Ombres »

ok merci jvais voir ca ...
désolé pour le plantage :P

Par contre j'ai mis un hook clavier aussi et apparemment
il marche tres bien sans que j'ai besoin de le mettre dans une dll...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tu est sûre que le Hook s'applique à tous les processus!!!
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Message par Ombres »

Oui le hook du clavier fonctionne bien quel que soit l'endroit ou je tape le texte ...
J'ai traduit le code, j'ai fait ma dll et ca fonctionne ... tant que je sur la fenetre ou celles du debuggeur :?
sinon c'est pareil toutes les autres fenetres plantent quand je clique dessus...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai moi même fait la traduction, il fonctionne bien, il faut que je rajoute des données à transmettre dans la mémoire partagée pour récupérer les données des structures suivant le ncode reçu, puis je le posterai dans Trucs et Astuces.

Je pense que ton problème vient de la déclaration de ton Hook, il faut que tu récupères le Handle du module de ta Dll pour t'en servir pour la déclaration.

Dans ton programme principal:

Code : Tout sélectionner

Hmodule = OpenLibrary(#Librairie, "c:\CBTHook.dll")
Dans ta DLL:

Code : Tout sélectionner

Hook = SetWindowsHookEx_(#WH_CBT,@CbtHook(),Hmodule,0)
Dis moi si ça marche!

:)
Ombres
Messages : 51
Inscription : sam. 24/janv./2004 12:46
Contact :

Message par Ombres »

Comme ca ca ne plante plus :D,
mais ca ne marche que si une fenetre du debuggeur ou
ma fenetre a le focus (pour le hook clavier et le hook cbt)

(jme sert de PostMessage_ pour envoyer les info des hook de la dll a ma fenetre)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Doit y avoir encore un truc qui manque!

J'ai posté mon code, jette un oeil :wink:

:)
Répondre