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 :

Hook + touche <Windows>


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut Hook + touche <Windows>
    Salut

    En lisant plusieurs post sur les hook clavier, je suis tombé sur ce petit lien

    http://www.codeguru.com/Cpp/W-P/system/keyboard/article.php/c5699

    super, tres interessant
    j'ai lu que si je faisais un
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (CallNextHookEx(hook,ncode,wparam,lparam));
    j'interrompais l'envoi de message au autre thread.

    j'ai donc fais un test et là.........probleme

    ca marche tres bien sur toutes les touches(quoique je ne les ai pas toutes tester donc...), mais ca ne marche pas sur la touche <windows>.

    c'est embetant puisque je voulais justement intercepter celle-ci pour ne pas pouvoir faire demarrer.

    donc si kelkun à une petit solution(modif du bout de prog du lien) ou autre.....bah je suis bien preneur.

    Merci d'avance

    @++


  2. #2
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    Salut, la touche est bien hookée, c'est à dire qu'on intercepte quand meme le message (on detecte bien l'appui sur la touche). Par contre, le menu démarrer s'affiche quand meme.

    Faudrait peut-etre essayer de regarder les messages plus en amont, ou bien faire un petite routine qui bloque (ou referme) le menu démarrer. Je vais essayer de regarder ca aussi

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    re

    oui oui la touche est bien hooker, faudrait simuler le echap alors

    à approfondir pour dire d'avoir quelque chose de plus prope quand meme lol

    vais essayer de voir aussi

    @++


  4. #4
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    En simulant le echap, tu perdrais le focus, et puis, si t'étais dans une appli plein écran, tu risques de sortir de l'appli. Je ne sais pas quel est le but, mais il doit y avoir moyen de traiter un message plus en amont, voire de hooker la création de la fenetre du menu démarrer (à voire aussi si ca bloque les combinaisons du type touche_windows+e touche_windows+r , etc ...)

  5. #5
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    re,

    en fouillant un peu, on peut simuler la touche shift pour bloquer la touche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        if(nCode >= 0) 
    	{
    		if ((GetAsyncKeyState(VK_LWIN )  & 0x8000) || (GetAsyncKeyState(VK_RWIN )  & 0x8000))
    		{
    			keybd_event(VK_SHIFT, 0,0,0);
    			keybd_event(VK_SHIFT, 0,KEYEVENTF_KEYUP,0);
                return true;
    		}
    	}
    	return CallNextHookEx(hookClavier, nCode, wParam,lParam);
    par contre, ca ne bloque pas le windows+e ou windows+r ... juste l'affichage du menu démarrer

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Salut


    Bon apres de multiple recherche( c'est pour ca que je ne t'ai pas repondu plus tot ), j'ai trouvé un bout code qui fonctionne (le tiens fonctionne mais celui-la est plus complet ).

    Pour ceux que ca interresse

    Dll.cpp


    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include "stdafx.h"
    #include "Dll.h"
     
    HINSTANCE handleInstance;
    HHOOK handleHook;
    HWND handleWnd = NULL;
     
     
    BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD  ul_reason_for_call, LPVOID lpReserved )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		handleInstance = hInstance;		// nécessaire pour l'installation du hook
    		return TRUE;
    	case DLL_PROCESS_DETACH:
    		// appel de la désinstallation du hook
    		if(handleWnd != NULL)
    			UninstallHook(handleWnd);
    		return TRUE;
    	}
        return TRUE;
    }
     
     
    BOOL __stdcall InstallHook(HWND hWnd)
    {
    	if(handleWnd != NULL)
    		return FALSE; // le hook est déjà installé
     
    	// tentative d'installation du hook
    	handleHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)MessageProc, handleInstance, 0);
     
    	// désactivation de la barre des taches (source : http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx)
    	HWND hwndTray = FindWindow("Shell_traywnd", NULL);
    	EnableWindow(hwndTray, FALSE);
     
     
    	if(handleHook != NULL)
    	{
    		// succès
    		handleWnd = hWnd;
    		return TRUE;
    	}
     
    	// échec
    	return FALSE;
    }
     
     
     
    BOOL __stdcall UninstallHook(HWND hWnd)
    {
    	// probleme de HWND ou le hook n'est pas installé
    	if(hWnd != handleWnd || hWnd == NULL)
    		return FALSE;
     
    	// réactivation de la barre des taches
    	HWND hwndTray = FindWindow("Shell_traywnd", NULL);
    	EnableWindow(hwndTray, TRUE);
    	//SetWindowText(hwndTray,"Test");
     
    	// tentative de desinstallation du hook
    	BOOL unhooked = UnhookWindowsHookEx(handleHook);
     
    	// si la desinstallation a reussi
    	if(unhooked)
    		handleWnd = NULL;
    	return unhooked;
    }
     
    LRESULT CALLBACK MessageProc (int nCode, WPARAM wParam, LPARAM lParam)
    {
    	/*EXTRAIT MSDN : If code is less than zero, the hook procedure must pass the message
    	to the CallNextHookEx function without further processing and should return the value
    	returned by CallNextHookEx.*/
     
    	if(nCode < 0)
    		return CallNextHookEx(handleHook, nCode, wParam, lParam);
     
    	if (nCode == HC_ACTION)
    	{
    		// récupération des données de lParam
    		PKBDLLHOOKSTRUCT params = (PKBDLLHOOKSTRUCT)lParam;
     
    		// blocage du alt+tab (donc si on recoit KEYDOWN pour tab et que flags = LLKHF_ALTDOWN : (alt appuyée))
    		if ( params->vkCode == VK_TAB && params->flags & LLKHF_ALTDOWN)
    			return TRUE;		// blocage du message
     
    		// blocage du alt+echap (qui agit un peu comme alt+tab)
    		if ( params->vkCode == VK_ESCAPE && params->flags & LLKHF_ALTDOWN)
    			return TRUE;		// blocage du message
     
    		// blocage des touches "Windows" : VK_LWIN et VK_RWIN
    		if ( params->vkCode == VK_LWIN || params->vkCode == VK_RWIN)
    			return TRUE;		// blocage du message
     
    		// récupération de l'état de la touche ctrl
    		BOOL ctrlDown = GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1); //(source : http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/default.aspx)
     
    		// blocage de ctrl+echap (qui agit comme les touches "Windows")
    		if ( params->vkCode == VK_ESCAPE && ctrlDown)
    			return TRUE;
    	}
     
     
    	// le message n'etait pas a bloquer, on le renvoie
    	return CallNextHookEx(handleHook, nCode, wParam, lParam);
    }
    Dll.h

    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
     
    #define EXPORT __declspec(dllexport)
    #define WH_KEYBOARD_LL     13
    #define LLKHF_ALTDOWN        (KF_ALTDOWN >> 8)
    #define LLKHF_EXTENDED       (KF_EXTENDED >> 8)
     
    // http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/HookReference/HookStructures/KBDLLHOOKSTRUCT.asp
    typedef struct {
        DWORD vkCode;
        DWORD scanCode;
        DWORD flags;
        DWORD time;
        ULONG_PTR dwExtraInfo;
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
     
     
    EXPORT BOOL __stdcall InstallHook(HWND hWnd);
    EXPORT BOOL __stdcall UninstallHook(HWND hWnd);
    LRESULT CALLBACK MessageProc (int nCode, WPARAM wParam, LPARAM lParam);
    Donc si j'ai compris ce code, c'est en faite le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct {
        DWORD vkCode;
        DWORD scanCode;
        DWORD flags;
        DWORD time;
        ULONG_PTR dwExtraInfo;
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
    qui nous permet de descendre un peu plus bas et d'intercepter le message : merci de me confirmer si c'est ca ou alors de m'expliquer parceque pour moi c'est presque la meme chose à part ca
    apparement c'est du "low-level keyboard input event" d'apres msdn.


    Encore merci pour ton exemple et de m'avoir mis sur la piste

    @++



  7. #7
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    Je pense (mais sans etre completement sur) que c'est plutot la désactivation de la barre de taches qui joue.
    La deuxieme partie du message (dans le lparam) permet juste d'avoir plus d'infos sur les evenements claviers recu.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par nico-pyright(c)
    Je pense que le bout de code mériterait d'etre dans la FAQ
    +1 ,objectif atteindre les 50 Q/R dans le post it ,
    Va falloir que je m'attelle à la mise à jour des 20 premières Q/R

  9. #9
    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
    Points : 16 075
    Points
    16 075
    Par défaut
    Si tu veux, je le regarde plus précisément et je le rédige, à moins que MadChris ne veuille le faire.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    re

    Pour la desactivation de la barre, j'avais essayé avec ton code mais sans succes(enfin je crois, j'ai fait tellement de test ).

    Pour ce qui est de la redaction, je prefere vous laisser faire(je ne me sens pas suffisament competent pour tout expliquer), mais ca me fait grand plaisir que tu me le propose


    @++


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Hook de messages windows (autres que souris/clavier)
    Par strayyy dans le forum Windows
    Réponses: 26
    Dernier message: 17/06/2009, 14h47
  2. [Hook] Hook pre-commit Windows
    Par gy0m76 dans le forum Subversion
    Réponses: 1
    Dernier message: 29/04/2009, 15h03
  3. Ipod Touch sur Windows
    Par derek corhs dans le forum Windows
    Réponses: 0
    Dernier message: 20/12/2008, 15h26
  4. hook clavier vs touches système WINDOWS
    Par konfo dans le forum C++Builder
    Réponses: 5
    Dernier message: 14/09/2008, 14h43
  5. [DELPHI6] et hook sur fenêtres windows
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 27/03/2006, 09h31

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