IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Récupérer le focus sur une fenêtre masquée avec SW_HIDE ?


Sujet :

MFC

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Est t-on vraiement obligé de passer par une dll pour faire un hook clavier ? Si oui pourquoi ?

  2. #22
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    oui, ils disent ca dans msdn

  3. #23
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    C'est bon j'ai réussit a linker cette ****** de dll, mais le problème c'est que quant j'utilise cette fonction dans mon programme (voir ci-dessous) ça ne fait rien (elle renvoi 0 je sais pas si c'est normal)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int DLLEXPORT installeLeHookClavier( void )
    {
        if( !hookClavier )
        {
            hookClavier  = SetWindowsHookEx(WH_KEYBOARD_LL, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
        }
        return (int) hookClavier;
    }
    PS: ceci vient de l'exemple de la faq

  4. #24
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    si tu es sous windows 98, le hook WH_KEYBOARD_LL ne marche pas, comme dit dans la faq

    Quelle touche veux-tu intercepter ? Il est fort probable que WH_KEYBOARD te suffise

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Mon problème est résolut, pour ce j'ai utilisé Microsoft Visual C++ v6.0

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    dsl, je revient sur mon problème....
    Citation Envoyé par nico-pyright(c)
    si tu es sous windows 98, le hook WH_KEYBOARD_LL ne marche pas, comme dit dans la faq
    J'ai remplacé cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowsHookEx(WH_KEYBOARD_LL, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
    par celle ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowsHookEx(WH_KEYBOARD, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
    Et ça ne fonctionne pas (la compilation réussit mais quant je presse les touches rien ne se passe) J'ai même essayé avec la touche A (VK_A) mais rien à faire....
    Y a t'il une autre modification à faire ?

    PS: j'ai pas changé le nom de la fonction (fonctionIntercepteClavierLowLevel)

  7. #27
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    montre ton code
    (le changement de nom de fonction n'interfere en rien)

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <windows.h>
    #define VK_A      65
     
    typedef struct { 
        DWORD vkCode; 
        DWORD scanCode; 
        DWORD flags; 
        DWORD time; 
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
     
    HINSTANCE moduleCourant;
    HHOOK hookClavier;
    HWND fenetre;
    BOOL statut;
     
    LRESULT CALLBACK fonctionIntercepteClavierLowLevel (int nCode, WPARAM wParam, LPARAM lParam) 
    {
    	if(nCode == HC_ACTION) 
    	{
    		KBDLLHOOKSTRUCT kbStruct = *((KBDLLHOOKSTRUCT *)lParam);
    		switch(wParam)
    		{
    			case WM_KEYDOWN:
    				if (kbStruct.vkCode == VK_A)
    				{
    				   if (statut)
    				   {
    				      PostMessage(fenetre,WM_USER+99,0,0);
    				      statut=false;
    				      return 1;
    				   }
    				   else
    				   {
    					  PostMessage(fenetre,WM_USER+99,1,0);
    				      statut=true;
    				      return 1;
    				   }
    				}
    				if (kbStruct.vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)) // bloque control+echap (ceci sert juste a voir si le hook a marché)
    						return 1;
    		}
    	}
    	return CallNextHookEx(hookClavier, nCode, wParam, lParam);
    }
     
    extern "C" int __stdcall installeLeHookClavier(HWND handle)
    {
    	if( !hookClavier )
    	{
            statut=false;
    		fenetre=handle;
    		hookClavier  = SetWindowsHookEx(WH_KEYBOARD, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
    	}
    	return (int) hookClavier;
    }
     
    extern "C" void __stdcall ArreteLeHookClavier()
    {
    	if(hookClavier)
    	{
    		UnhookWindowsHookEx(hookClavier);
    		hookClavier = 0;
    	}
    }
     
    BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
    {
    	if (dwReason == DLL_PROCESS_ATTACH) 
    	{
    		moduleCourant = hDll;
        }
    	if (dwReason == DLL_PROCESS_DETACH) 
    	{
    		ArreteLeHookClavier();
    	}
    	return 1;
    }

  9. #29
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    c'est parce que le hook WH_KEYBOARD ne fonctionne pas pareil que le hook WH_KEYBOARD_LL

    dans la callback, il faut tester wParam == VK_A pour savoir si la touche a été appuyée
    n'hésite pas à regarder dans msdn

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Pas besoin de la structure "KBDLLHOOKSTRUCT" alors..?

  11. #31
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    non, pas besoin

    teste juste wParam

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    J'ai fait comme ça mais ça fonctionne seulement quant la fenêtre possède le focus clavier (donc c'est plus un hook)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LRESULT CALLBACK fonctionIntercepteClavierLowLevel (int nCode, WPARAM wParam, LPARAM lParam) 
    {
         switch(wParam)
         {
              case VK_F11:
                   PostMessage(fenetre,WM_USER+99,0,0);
              break;
     
              case VK_F10:
                   PostMessage(fenetre,WM_USER+99,1,0);
              break;
         }
    return CallNextHookEx(hookClavier, nCode, wParam, lParam);
    }
    D'ou vient le problème?

  13. #33
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    il est bien dans une dll ? tu le raccroches bien au module courant dans le dll_process_attach ? (comme dans l'exemple)

  14. #34
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Oui c'est bien dans la DLL, sinon j'ai rien changé de plus que la fonction "fonctionIntercepteClavierLowLevel" et "WH_KEYBOARD_LL" en "WH_KEYBOARD"

  15. #35
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ca devrait marcher ...

    retourne 0 temporairement après le postmessage (pour bloquer l'action), pour voir si ca bloque bien l'action

  16. #36
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Je vient de faire le test (j'ai mis "return 0;") , le fontionnement et vraiment étrange :

    Que le programme ai le focus ou pas, la touche n'est pas bloquée.
    (Pour voir si mon programme régit avec les touches F10 et F11 j'ai mis ces touches dans les accélérateurs clavier)

    -La DLL envoie le message à l'appli seulement si la fenêtre à le focus.
    -L'application reçoit le message de la DLL avant le message WM_COMMANDE envoyé par l'accélérateur.

    Donc le ""hook"" ne fonctionne pas.

    Peut être que "WH_KEYBOARD" ne marche que sous Win98 et pas sur des version supèrieures... !?!?

    EDIT: je vient d'essayer de mettre WM_USER+95 plutôt que WM_USER+99, je me suis dit que le conflit pouvait éventuellement venir de la mais le résultat et le même

  17. #37
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    peux-tu faire voir le code de ton exe ? (l'appel aux fonctions du hook)

  18. #38
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Voila la partie du code qui concerne les fonctions de la DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    extern "C" int __stdcall installeLeHookClavier(HWND);
    extern "C" void __stdcall ArreteLeHookClavier();
     
    //switch sur les messages de l'application
     
        case WM_CREATE:
            //initialisation du programme
            installeLeHookClavier(hwnd);
            WSADATA WSAData;    //pour utiliser les sockets
            WSAStartup(MAKEWORD(2,0), &WSAData);
        return 0;
     
        //j'ai mis juste les messages ou aparaisent les fonction de la DLL
     
        case WM_CLOSE:
            if(MessageBox(hwnd,"Etes vous certain de vouloir quitter?","Confirmation",MB_YESNO | MB_ICONQUESTION)==IDYES)
            {
                //fermeture des sockets (c'est un prog. qui utilise les sockets)
                PostQuitMessage(0);
                ArreteLeHookClavier();   //Termine le hook clavier (fonction contenue dans la DLL)
            }
        return 0;
     
        default:   //Messages non traités
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    Je doute que le problème viene du programme lui même car lorsque je recompile la DLL avec "WM_COMMANDE_LL" et fait les modifications necsessaires tout marche à merveille. mais pas sous Win98

  19. #39
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    personne arrive a résoudre mon problème
    Si quelqu'un arrive à faire un hook claiver qui marche avec win98 (avec WH_KEYBOARD et non WH_KEYBOARD_LL) ça serait simpa de me passer le code.

    Merci

  20. #40
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, je t'ai fait un petit exemple, je te le poste ce soir, dès que je pourrais uploader

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Outlook et perte du focus sur une fenêtre
    Par Abac_Angelique dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 16/07/2013, 18h28
  2. Perte de focus sur une fenêtre modale
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 07/01/2011, 14h32
  3. Image sur une fenêtre créer avec l'API
    Par Mirsa dans le forum Visual C++
    Réponses: 3
    Dernier message: 05/12/2006, 09h08
  4. Réponses: 8
    Dernier message: 29/08/2006, 10h22
  5. [PowerBuilder] Récupérer la main sur une fenêtre modale
    Par jpdar dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo