Accueil > Forum > > > > HOOK: Problème de cast C2440
HOOK: Problème de cast C2440
dimanche 28 octobre 2007 à 14:43:42 |
HOOK: Problème de cast C2440

RV2931
|
Bonjour, Je fais uen petite appli OpenGL. J'ai crée une classe qui affiche de l'OpenGL dans n'importe quel composant (HWND) de l'interface, bref. Je voudrais que la gestion des interactions clavier et souris sur le composant soit géré automatiquement par la classe et non par la WndProc du programmer principal. Je veux donc utiliser un hook mais je n'arrive pas :o( J'ai vu sur un post qu'il fallait faire comme si on prenait la fonction de hook d'une DLL, ce qui explique le format de la fonction hook, sinon ça se présente comme ça pour le moment : class OGLW { public: PIXELFORMATDESCRIPTOR pfd; int iFormat; HDC hDC; HGLRC hRC; HWND hWnd; public: OGLW(GLvoid); OGLW(HWND hWnd,vector<float>*VerticesTab,vector<float>*ColorsTab); __declspec(dllexport) LRESULT CALLBACK HookWndProc(int nCode, WPARAM wParam, LPARAM lParam ); bool InitGL(HWND hWnd,vector<float>*VerticesTab,vector<float>*ColorsTab); bool ReSizeGLScene(GLsizei width, GLsizei height); bool DrawGLScene(GLvoid)=0; ~OGLW(void); }; bool OGLW::InitGL(HWND hWnd,vector<float>*VerticesTab,vector<float>*ColorsTab) { InitGL(hWnd,VerticesTab,ColorsTab); //Mise en place du Hook this->hWnd=hWnd; HINSTANCE hExe = GetModuleHandle(NULL); SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookWndProc,hExe,NULL); .... } __declspec(dllexport) LRESULT CALLBACK OGLW::HookWndProc(int nCode, WPARAM wParam, LPARAM lParam ) { switch(nCode) { case WM_LBUTTONDOWN:MessageBox(hWnd,"Bouton Gauche","Hook",MB_OK);break; default:break; } return CallNextHookEx(hKeyHook, nCode,wParam,lParam); } Et là, c'est le drame : error C2440: 'cast de type' : impossible de convertir de 'overloaded-function' en 'HOOKPROC' sous Visual C++
Donc voilà, je ne sais pas quoi faire pour résoudre le problème Une solution ?? Merci RV L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
dimanche 28 octobre 2007 à 16:22:55 |
Re : HOOK: Problème de cast C2440

juju12
|
Réponse acceptée !
Tu peux pas déclarer des fonctions membres de classe comme CALLBACK dans l'API Windows puisqu'elles sont __thiscall (nécessitent un pointeur this passé implicitement en premier paramètre par le compilo), Windows réclame du __stdcall. Une méthode courante est de stocker un pointeur sur la classe en paramètre avec SetWindowLong et GWL_USERDATA; après tu fais une fonction non-membre (éventuellement static) de hook qui se chargera de répartir dans la bonne classe : GlobalHookWndProc(HWND hWnd,..) { OGWL* pClass=(OGWL*)GetWindowLong(hWnd,GWL_USERDATA); pClass->HookWndProc(hWnd,...); }
Sinon ce que tu pourrais faire c'est éviter le hook et passer par un sous-classement du contrôle, mais tu aura besoin du même genre de manips pour appeler une fonction membre de classe.
|
|
dimanche 28 octobre 2007 à 17:53:39 |
Re : HOOK: Problème de cast C2440

RV2931
|
Ouay, ça me paraît compliqué, c'est dommage parce que c'est tout a fait ça que je voudrais faire, créer une fenêtre OpenGL totalement indépendante, mais je pense que je vais faire comme pour ma fonction DrawScene, je vais faire une petite fonction qu'on appelle dans la WndProc principale qui prend en paramètre le message et les wParam et lParam et je pense que je vais m'en sortir.
Merci
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
dimanche 28 octobre 2007 à 17:55:41 |
Re : HOOK: Problème de cast C2440

RV2931
|
Je t'ai mis réponse acceptée parce que je vais faire autrement, mais après réflexion, si tu peux être plus précis, et explicité le sous classement, ça pourra toujours servir à d'autres
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
dimanche 28 octobre 2007 à 18:10:46 |
Re : HOOK: Problème de cast C2440

racpp
|
Salut, De toute façon, pour un hook de type WH_GETMESSAGE, tu seras obligé d'utiliser une DLL externe. Un hook global avec la fonction de hook intégrée dans l'exécutable ne fonctionne qu'avec les types WH_KEYBOARD_LL et WH_MOUSE_LL.
|
|
dimanche 28 octobre 2007 à 18:12:17 |
Re : HOOK: Problème de cast C2440

RV2931
|
J'ai trouvé un truc pas mal sur le sous classement, assez simple mais j'ai pas encore testé si ça fonctionnait juste comme ça pour ce que j'ai envie de faire
http://www.cppfrance.com/codes/WIN32-BOUTON-BITMAP-SUBCLASSING_35623.aspx
Sinon, question annexe, comment fait on pour récupérer le hWnd de l'objet sur lequel l'utilisateur vient de cliquer, ou celui qui le focus... ???
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
dimanche 28 octobre 2007 à 18:15:01 |
Re : HOOK: Problème de cast C2440

RV2931
|
Ben à la limite, si tu as un exemple de code pour les WH_KEYBOARD_LL et WH_MOUSE_LL, ça pourrait me servir je pense...
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
dimanche 28 octobre 2007 à 18:32:04 |
Re : HOOK: Problème de cast C2440
|
dimanche 28 octobre 2007 à 18:42:46 |
Re : HOOK: Problème de cast C2440

juju12
|
Sinon pour récupérer le hWnd ben c'est simplement celui qui est fourni à la WndProc du contrôle en question... Pour le focus il y a peut-être GetFocus() mais je l'ai jamais essayé je sais pas si ca renvoie la fenêtre principale ayant le focus ou bien le contrôle (je penche pour le 2 tout de même).
|
|
dimanche 28 octobre 2007 à 21:14:47 |
Re : HOOK: Problème de cast C2440

RV2931
|
J'ai essayé la technique static WndProc et GWL_USERDATA mais je crois que mon pointeur est tronqué, mon OGLW* ne tient peut-être pas sur 32 bits
C'est bien comme ça :
static LRESULT CALLBACK OGLW::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ // Récupération du paramètre et donc du pointeur vers l'instance de la classe associée à l'objet hWnd OGLW*MyOGLW=(OGLW*)GetWindowLong(hWnd,GWL_USERDATA); // Accès à une donnée de l'instance de classe MyOGWL->MyVar=0; ... }
bool OGLW::InitGL(HWND hWnd,float*VerticesTab,float*ColorsTab) { // Remplacement de la fonction de traitement OldWndProc=(WNDPROC) SetWindowLong(hWnd,GWL_WNDPROC,(LPARAM)WndProc); // Mise du pointeur de l'instance de classe dans le user data de la fenêtre hWnd SetWindowLong(hWnd,GWL_USERDATA,(LONG)this); .... }
ça fonctionne, mais petite subtilité, je suis obligé de faire un SetFocus(hWnd) pour récupéré les évênements Keyboard, Est-ce normal ? pourquoi ? et peut-être y a-t-il une autre manière ???
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
Cette discussion est classée dans : hwnd, wparam, vector, hook, oglw
Répondre à ce message
Sujets en rapport avec ce message
pb a la fermeture de win [ par stick ]
bonjours,alors voilou, je fais une appli en utilisant l'api window, mais si je ferme windows sans quitter le programme auparavant, celui ci plante et
Dll Visual Aide [ par TheMaster ]
Salut!j'ai un probleme, j'ai créer un logiciel permettant de visualiser des images.Les images sont stocke en ressource dans un dll.Mais je n'arrive pa
Probleme applic windows simple [ par zzzzzz ]
#include #include "resource.h"HWND handleee;HINSTANCE hinstanceee;const char ClasseWindows[] = "NomClasseWindows";LRESULT CALLBACK WindowProcedure(HWN
Probleme SendMessage(...) [ par Hevelina ]
SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); Bonjour j ai quelques problemes.Je doit faire un programme de lecture de musique pour
Pb sur un ptit bout de prog en DirectX.... [ par Haldwin ]
Salut a tous....Voila j'ai deux ptits pbs quand je lance cette appli ci-dessous... (VC++)La première est q'une fois sur deux ma variable hWnd apres le
thread sur WndProc [ par kidpigeyre ]
G une fonction WndProc chargé de réaliser tout mon programme (application GUI) (avec fenetre windows) et jmerai pouvoir faire un thread de cette fonct
Edit Control [ par cybermatthieu ]
Bonjours,Je suis en Train d'apprendre comment progrmmer en Win32 avec la Class Windows.h. Ce petit programme ne fait q'afficher des caracter mais j'ai
crer "dialog non modal" [ par comfm ]
BonjourJe n'arrive pas à créer une boite de dialogue non modal, c'est à dire celle qui permet d'être tjs affichée et on peut cliquer derriere sans pro
ouvrir une 2eme fenetre avec editbox et tout et tout, c'est possible? [ par Arnaud16022 ]
Hello tout le monde!je voudrais mettre un bouton dans une fenetre (ca c'est facile), mais seulement quand on clique dessus un autre fenetre s'ouvre, a
PB EditBox [ par SfyLer ]
Bonjour à tous !J'ai créé un scanner de port sous dos, et j'ai commencer a le faire sous windows, j'ai presque fini le seul pb que j'ai c'est que je n
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|