begin process at 2012 05 29 09:05:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

HOOK: Problème de cast C2440


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

racpp

Administrateur CodeS-SourceS
Regarde mon dernier code source dans lequel j'utilise un hook WH_KEYBOARD_LL:
http://www.cppfrance.com/codes/DETOURNER-FRAPPE-CLAVIER_43964.aspx
Pour le sous-classement, voici une réponse que j'ai posté dans le forum:
http://www.cppfrance.com/infomsg_BLOQUER-TOUCHE-ENTREE_327459.aspx

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"

1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales