SetPropA

Résolu
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 3 juin 2007 à 14:51
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 3 juin 2007 à 20:15
Bonjour,
m'etant remis au C++ pour une enieme fois j'ai reussi a trouver quelques chose d'interressant a faire : les hook
je sais que c'est un peu ambitieu mais bon ...
pour commencer j'ai recuperer toute sorte de source et de tuto
ma question concerne ce qui a ete utilise dans une source :
SetPropA(GetDesktopWindow(),

"VISIO_HOOK_CBT", destination);
// Association du handle du programme appellant au Handle du bureau windows pour le hook CBTje sais que SetPropA sert a fixe des propriete mais je comprend pas comment ... je ne vois pas a quoi ca pourrais servir ici?
car que se soit dans le code de la dll ou dans celui de l'executable je ne vois aucun appel a GetPropA donc je trouve bizarre quand je fais ca :

// SetPropA(GetDesktopWindow(), "VISIO_HOOK_CBT", destination); // Association du handle du programme appellant au Handle du bureau windows pour le hook CBThookCbt = SetWindowsHookEx(WH_CBT, (HOOKPROC)CbtHookCallback, appInstance, threadID);

// Mise en place du hook CBT

// SetPropA(GetDesktopWindow(), "VISIO_HOOK_SHELL", destination); // Association du handle du programme appellant au Handle du bureau windows pour le hook SHELLhookShell = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellHookCallback, appInstance, threadID);

// Mise en place du hook SHELLca ne marche pas ..

sur la msdn je ne trouve rien sur propA , j(utilise la version express de VSC++ 2005

merci d'avance pour vos explication
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

10 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 juin 2007 à 15:12
Salut,

Moi je vois un appel a GetPropA() dans chaque callback de hook.

Mais je trouve que c'est quand meme plus joli (et plus rapide) de
mettre les deux HHOOK en global, dans une section shared, comme on le
fait généralement.
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 juin 2007 à 15:27
Salut,

Le truc c'est que tu as besoin d'avoir le HHOOK dans la callback du
hook, pour pouvoir appeler CallNextHook(). Or cette callback peut etre
appelée dans le contexte de n'importe quel processus, et donc il faut
que le HHOOK soit global au systeme (et non pas simplement global a la
dll). L'auteur de la source associe donc ce HHOOK a une fenetre qui ne
risque pas d'etre détruite pendant la durée de vie du hook, il a choisi
la fenetre du desktop, mais ca doit aussi marcher avec la fenetre de la
taskbar ou le bouton 'démarrer' de windows...

Pour GetProp et SetProp, c'est bien dans msdn, c'est une api d'user32.
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 juin 2007 à 16:14
Salut,

Pour le coup du SendNotifyMessage je peux pas trop t'aider je comprend pas bien le code managé.

Par contre je viens de mieux regarder le code du hook, et c'est pas les
HHOOK qu'il sauve avec SetProp mais le HWND de destination (de la
fenetre qui va recevoir tout les infos recoltés par le hook). Sur le
principe ca ne change rien, il se sert bien de la fenetre pour pouvoir
retrouver les HWND facilement depuis n'importe quel instance de la dll
de hook. Par contre, je ne vois aucun systeme similaire pour retrouver
les HHOOK, et je trouve pas ca tres propre, ca les HHOOK ne seront pas
valides dans les autres processus et donc le CallNextHookEx echouera a
coup sur).
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
3 juin 2007 à 16:52
Salut,

Si msdn dit que hhk est ignored, alors pas de soucis :)
3

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

Posez votre question
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
3 juin 2007 à 14:53
remise en forme :
Bonjour,
m'etant remis au C++ pour une enieme fois j'ai reussi a trouver quelques chose d'interressant a faire : les hook
je sais que c'est un peu ambitieu mais bon ...
pour commencer j'ai recuperer toute sorte de source et de tuto
ma question concerne ce qui a ete utilise dans une source :
SetPropA(GetDesktopWindow(),

"VISIO_HOOK_CBT", destination); // Association du handle du programme appellant au Handle du bureau windows pour le hook CBT
je sais que SetPropA sert a fixe des propriete mais je comprend pas comment ... je ne vois pas a quoi ca pourrais servir ici?
car que se soit dans le code de la dll ou dans celui de l'executable je ne vois aucun appel a GetPropA donc je trouve bizarre quand je fais ca :

// SetPropA(GetDesktopWindow(), "VISIO_HOOK_CBT", destination); // Association du handle du programme appellant au Handle du bureau windows pour le hook CBT
hookCbt = SetWindowsHookEx(WH_CBT, (HOOKPROC)CbtHookCallback, appInstance, threadID);

// Mise en place du hook CBT

// SetPropA(GetDesktopWindow(), "VISIO_HOOK_SHELL", destination); // Association du handle du programme appellant au Handle du bureau windows pour le hook SHELL
hookShell = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellHookCallback, appInstance, threadID);

// Mise en place du hook SHELL

ca ne marche pas ..

sur la msdn je ne trouve rien sur propA , j(utilise la version express de VSC++ 2005

(source que je cite : http://www.cppfrance.com/codes/HOOK-GLOBAL-CPLUSPLUS-MANAGE-DLL-NATIVE_42838.aspx )
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
3 juin 2007 à 15:18
a oui au temps pour moi :$ je pensais aps le trouver la

par contre je trouve pas de msdn pour Set/GetPropA ,GetDesktopWindow , aurais tu ou la trouver ?

car le : "Handle du bureau windows" vois pas a quoi cela pourrais servir ...

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
3 juin 2007 à 15:53
ok pour les deux fonctions , je m'attendais au termes exact (sale habitude du java)

tu m'as bien aide je m'attendais pas a ce que ce soit pour ca ...

en gros pour synthetiser :
les Set/GetProp servent a stocker des propriete a une fenetre quelconque la dans notre exemple dans la "fenetre" du bureau windows on cree une propriete contenant le HHook du programme qui a appele cette DLL et tout cela d'apres ce que je vois du code pour pouvoir envoyer un message au programme :


HWND destination = (HWND)GetPropA(GetDesktopWindow(), "VISIO_HOOK_SHELL"); // Récupération du handle de destination


SendNotifyMessage(destination, msg, wparam, lparam); // Envois du message au handle de destination


apres nous avons un appel a CallNextHookEx et d'apres la msnd j'en comprend que c'est pour "relancer" le hook apres avoir traiter l'information passe donc dans notre cas , avoir envoyer un message a l'application gerant le hook

je me trompe ?

sinon une derniere question me viens ... :$
dans les source de l'exe je vois ca :


public:event WindowEventHandler ^Activate;



public


:event WindowEventHandler ^CreateWindow;public

:event WindowEventHandler ^DestroyWindow;public

:event WindowEventHandler ^MinMax;public

:event WindowEventHandler ^MoveSize;public

:event WindowEventHandler ^SetFocus;public

:event SysCommandEventHandler ^SysCommand;public

: event WindowEventHandler ^WindowActivated;public

: event WindowEventHandler ^WindowCreated;public

: event WindowEventHandler ^WindowDestroyed;ce sont des evenement propre au hook , ces methodes sont appele comme ceci :

public: void ProcessSystemMessage(System::Windows::Forms::Message %m){

int MSG = m.Msg;

if(MSG == ID_CBT_Activate) Activate(m.WParam);
etc....

}

mais ProcessSystemMessage est appele ici :

protected:virtualvoid WndProc(Message %m) override

{

if (mcbth != nullptr)

mcbth->ProcessSystemMessage(m);

Form::WndProc(m);

}

c'est une methode appele lorsque la dll fais SendNotifyMessage ?

desole pour ces questions qui peuvent paraitre simple mais je trouve relativement peu de doc et la msdn n'est pas toujours clair :$

et merci beaucoup pour ton aide ... malgre la cuite dhier soir je comprend de mieu en mieu comment ca marche ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
3 juin 2007 à 16:19
pour le hhook dans CallNextHookEx :

<dt>hhk</dt><dd>[in] Windows 95/98/ME: Handle to the current hook. An application receives this handle as a result of a previous call to the SetWindowsHookEx function.
Windows NT/XP/2003: Ignored.

donc il n'echoueras pas je pense ...

en gros si je comprend bien mettre les HHOOK en globale tu trouve ca pas tres propres ? car on ne sais pas si ils seront toujours valable
"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"

</dd>
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
3 juin 2007 à 17:03
ok ok ^^ merci pour toutes tes reponses ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 juin 2007 à 20:15
Fort exact, le retour de SetWindowsHookEx ne sert plus qu'à l'appel de fermeture du hook, Windows ne le lit plus quand on repasse dans la chaine de hook. C'était une cause de plantage system sur les winbébés, now c'est le system qui maintient le bon handle et tout va bon.
J'ai gardé depuis ma lointaine jeunesse l'habitude de placer le HHOOK en shared mais totalement inutile maintenant.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous