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

Windows Discussion :

Interception des messages CLAVIER


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut Interception des messages CLAVIER
    Bonjour,
    Dans ma procedure je n'arrive pas à intercepter le "Return". Je ne capte aucun message venant du clavier ...
    La fenetre "principale" dans le cas present est une "Static" mais j'ai mis SS_NOTIFY, donc je devrais recevoir les messages ???
    Voilà un bout de mon code :
    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
    hmodif = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, //WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
    			        "Static", "", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 			
    			        50, 45,	500, 140,						
    			        hWnd, (HMENU)1,	hInst, NULL);
               
               lpfnOldWndProc7 = (FARPROC)SetWindowLong(hmodif,
                                  GWL_WNDPROC, (DWORD) ProcCherche);
               hsttitre = CreateWindowEx(WS_EX_LEFT,
    			              "Static", "",	WS_CHILD | WS_VISIBLE, 			
    			              140, 2, 280, 30,						
    			              hmodif, (HMENU)1, hInst, NULL);
               SendMessage (hsttitre, WM_SETFONT, (UINT)hFont3, 0);
    		   SetWindowText(hsttitre, "Recherche d'Opérations ...");
    
               hvalider = CreateWindowEx(WS_EX_CLIENTEDGE,
    			              "Button", "",
                              WS_VISIBLE|WS_CHILD|WS_GROUP|BS_DEFPUSHBUTTON,
                              30,95,180,25, hmodif, NULL, hInst, NULL);
               SendMessage (hvalider, WM_SETFONT, (UINT)hFont2, 0);
    		   SetWindowText (hvalider, "Lancer la recherche ...");

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est pour "cliquer" sur le bouton quand il appui sur entrée ?
    Ta fenêtre principale (hWnd) est une fenêtre classique ou une dialog box ?
    Quel est le code de ProcCherche ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    C'est pour "cliquer" sur le bouton quand il appui sur entrée ?
    Ta fenêtre principale (hWnd) est une fenêtre classique ou une dialog box ?
    Quel est le code de ProcCherche ?
    Bonjour,
    Oui, je cherche le code pour faire comme dans une dialogbox, c'est a dire appuyer su "entrée" pour valider.
    ça marche lorsque le focus est sur la static, mais dès que le curseur est sur la zone à saisir, plus d'entrée clavier ...
    Voilà le code de ma procedure :
    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
    LRESULT CALLBACK ProcCherche (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    
    static COLORREF RGBMODIF = RGB(0, 0, 0);
    static COLORREF RGBBLANC  = RGB(255, 255, 255);
    
    char szBuffer[80];
    
            switch (message) {
    //	      case WM_CREATE:
    //             return 0;
    
    		  case WM_CTLCOLORSTATIC :
    			if (((HWND)lParam == hsttitre)
    			||	((HWND)lParam == hstmont))
    			{
                  SetBkMode ((HDC)wParam, TRANSPARENT);
                  SetBkColor ((HDC)wParam, RGBMODIF);
                  SetTextColor ((HDC)wParam, RGBBLANC);
                  return ((DWORD) hBrush3);
    			}
                
    
              case WM_DESTROY:
                ShowWindow(hstatic1, SW_SHOW);
                ShowWindow(hstattitre, SW_SHOW);
                ShowWindow(hstatic5, SW_SHOW);
                Enable_Disable_Menu(MF_ENABLED);
                return 0;
    
    
              case WM_COMMAND:
                switch (wParam)
    			{
    			  case BN_CLICKED:
    //Annuler
    			    if (lParam == hfermer) {
                      wselection=save_wselection;
                      SendMessage (hwndmvts, LB_RESETCONTENT, 0, 0L);
                      EnableWindow (hwndmvts, TRUE);  
                      LireMVTS (hwnd, compte_courrant, wselection, mode_histo);
                      DestroyWindow(hmodif);
    				}
    //Validation
    			    if (lParam == hvalider) {
                      GetWindowText(hmont, crit_recherche, sizeof(crit_recherche));
                      if (!strcmp(crit_recherche, "")) {
                        strcpy(szBuffer, "Veuillez entrer un critère de recherche !");
                        MessageBox (hwnd, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION);
                      }
    				  else {
                        SendMessage (hwndmvts, LB_RESETCONTENT, 0, 0L);
                        EnableWindow (hwndmvts, TRUE);  
                        LireMVTS (hwnd, compte_courrant, wselection, mode_histo);
    				  }
    				}
    			}
    		}
    
    return CallWindowProc(lpfnOldWndProc7, hwnd, message, wParam, lParam);
    }

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut
    La procedure peut paraitre banale mais je n'ai pas de reponse au "WM_
    comme je l'avais codé auparavant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	case WM_KEYDOWN :
    	switch(wParam)
    		{
    		case VK_RETURN :
    		case VK_SPACE :
    		SendMessage(GetWindowWord(hwnd,GWW_HWNDPARENT),WM_COMMAND,GetWindowWord(hwnd,GWW_ID),MAKELPARAM(hwnd,BN_CLICKED));
    		break;
    		}
    ou bien encore à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    case WM_GETDLGCODE :
    	if((lParam != NULL) && (((LPMSG)lParam)->message == WM_KEYDOWN))
    	 	if((((LPMSG)lParam)->wParam == VK_RETURN) || (((LPMSG)lParam)->wParam == VK_SPACE))
    			return(DLGC_WANTMESSAGE);
    
    	return(DLGC_BUTTON);

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Est-ce une boite de dialogue ou une fenêtre crée avec CreateWindow ?
    Ton bouton a-t-il l'id IDOK ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Est-ce une boite de dialogue ou une fenêtre crée avec CreateWindow ?
    Ton bouton a-t-il l'id IDOK ?
    C'est une fenetre crée avec CreateWindowEx comme tous ses controles "child" mais le bouton de validation à le handle "hvalider"
    Le code de création se trouve plus haut, au debut de mon post.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Je parlais de l'ID, l'avant-avant-dernier paramètre passés à CreateWindow (pour les fenêtre filles). Tu n'en n'utilise pas et tu devrais.
    Dans le cas d'une dialogbox, les boutons avec le style IDOK et IDCANCEL sont automatiquement cliqués quand on appui sur ENTREE/ESC. C'est la fonction IsDialogMessage qui se charge de ça. Elle se charge aussi de faire bouger le focus quand on appui sur tab.
    Donc tu as 2 possibilités:
    - laisser IsDialogMessage faire le boulot et alors tu as juste à jouer avec l'id de tes controles (pas besoin de gérer VK_RETURN, VK_SPACE...)
    - ne pas l'utiliser, et il te faut alors subclasser ton EDIT pour intercepter le return...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Donc tu as 2 possibilités:
    - laisser IsDialogMessage faire le boulot et alors tu as juste à jouer avec l'id de tes controles (pas besoin de gérer VK_RETURN, VK_SPACE...)
    - ne pas l'utiliser, et il te faut alors subclasser ton EDIT pour intercepter le return...
    Je ne comprends pas tres bien pourquoi tu parles de IsDialogMessage puisque tous les controles sont créés "dynamiquement" par des CreateWindowEx ?
    Quant au subclassement de l'EDIT, comment puis je faire ? Sachant que la fenetre "Parent" est déja subclassé sur la procedure "ProcCherche" ?
    Faire une procedure spéciale uniquement pour l'EDIT, mais ça ne resoud pas la gestion des touches (ENTER et TAB) dans ma procedure ?

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Consulte ce lien (le dernier message), c'est peut-être le même problème.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dede92
    Je ne comprends pas tres bien pourquoi tu parles de IsDialogMessage puisque tous les controles sont créés "dynamiquement" par des CreateWindowEx ?
    IsDialogMessage s'insère dans la boucle des messages et se charge de donner à ta fenêtre le comportement d'un dialogue. C'est indépendant de CreateWindowEx. Tous les composants sont créés "dynamiquement". Quand tu dessines un dialogue dans ton designer et que tu donnes le template à DialogBox / CreateDialog, ces fonctions analysent le template et appellent CreateWindowEx pour créer les composants...
    IsDialogMessage se charge du comportement spécifiques des dialogues:
    En l'utilisant, tu transformes quasiment ta fenêtre en dialog...
    http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxprogrammingconsiderations.asp
    (voir "Dialog Box Keyboard Interface")

    Quant au subclassement de l'EDIT, comment puis je faire ? Sachant que la fenetre "Parent" est déja subclassé sur la procedure "ProcCherche" ?
    Faire une procedure spéciale uniquement pour l'EDIT, mais ça ne resoud pas la gestion des touches (ENTER et TAB) dans ma procedure ?
    Rien ne t'empêche de subclasser un edit si son parent l'est déjà. C'est indépendant. Il te faut bien créer une procédure spécifique pour ton edit...

    Pour le probleme du tab dans l'edit j'ai pas pigé.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    525
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 525
    Points : 212
    Points
    212
    Par défaut
    Aurelien, j'ai suivi tes conseils et j'ai mis effectivement un ID pour chacun des boutons et j'ai modifié la boucle message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while ((status = GetMessage(&msg, NULL, 0, 0))) {
    		if (status == -1) return -1;
            if (hmodif == 0 || !IsDialogMessage(hmodif, &msg))
    		{
    	  	  TranslateMessage(&msg);
    		  DispatchMessage(&msg);
    		}
        }
       
        return msg.wParam;
    Les tabulations fonctionnent ainsi que la touche ENTER ...
    Merci encore à tous.

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

Discussions similaires

  1. Probleme interception des messages
    Par dalton5 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/09/2009, 14h32
  2. Interception des messages NetSend
    Par Flow_75 dans le forum C
    Réponses: 0
    Dernier message: 22/05/2008, 13h27
  3. Réponses: 13
    Dernier message: 25/06/2006, 20h08
  4. intercepter les messages clavier dans un CDialog
    Par firejocker dans le forum MFC
    Réponses: 3
    Dernier message: 26/12/2005, 11h14
  5. Interception des messages windows
    Par sunchai dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/08/2005, 10h31

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