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 :

[C][API win32] DialogBox événements


Sujet :

Windows

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut [C][API win32] DialogBox événements
    Bonjour je voudrais effectuer des opérations suites au événements du genre "keyPresssed" et "keyReleased" en C à partir de la DialogBox, est-ce possible de se connecter à des événements de ce type ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    WM_KEYDOWN, WM_KEYUP...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    ok merci trop de la balle ^^

  4. #4
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    sorry mais ca ne marche pas mes tableaux ne se remplissent pas :s
    voila mon code qui lance ma dialogue Box :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DialogBox(dllHandle,
                 MAKEINTRESOURCE(IDD_PWDIALOG),
                 NULL,
                 (DLGPROC)CapturePassword);
    et j'arrive bien dans cette fonction mais ca ne me remplis pas mes tableaux de tps :

    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
    BOOL CALLBACK CapturePassword(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	RECT rcDlg, rcDesktop;
    
    	switch (message)
    	{
    		/*	This message is sent when the dialog gets created */
    		case WM_INITDIALOG:
    
    			GetWindowRect(GetDesktopWindow(), &rcDesktop);
    			GetWindowRect(hwndDlg, &rcDlg);
    
    			/* Center Dialog on the desktop */
    
    			SetWindowPos(hwndDlg,
    				HWND_TOP,
    				rcDesktop.right/2  - ((rcDlg.right	 - rcDlg.left)	/ 2),
    				rcDesktop.bottom/2 - ((rcDlg.bottom	 - rcDlg.top)	/ 2),
    				0, 0,  /* ignores size arguments; no resize desired */
    				SWP_NOSIZE);
    
    			/* Start dialog with focus in the password edit box */
    			SetFocus(GetDlgItem(hwndDlg, IDC_PWEDIT));
    			break;
    		case WM_KEYDOWN: 
    
    			temps_initial = clock ();
    			if(iter==1){
    				latency[indexLatency++]=(temps_initial-temps_tmp);
    			}
    			temps_tmp=temps_initial;
    			iter=1;
    			break;
    		case WM_KEYUP: 
    
    			temps_final = clock ();
    			temps_cpu = (temps_final - temps_initial);
    			pressed[indexPressed++]=temps_cpu;
    			break;
    		case WM_COMMAND:
    			switch (LOWORD(wParam))
    			{
    				case IDOK:
    					/*	Dump the password into BSP memory */
    					if (!GetDlgItemText(hwndDlg, IDC_PWEDIT, inputPassword1,
    							MAX_PASSWORD_SIZE + 1))
    						/* if call fails, null out the password cache */
    						*inputPassword1=0;
    
    				/* fall through after ok is pressed */
    				case IDCANCEL:
    					EndDialog(hwndDlg, wParam);
    					return TRUE;
    			}
    	}
    	return FALSE;
    }
    j'affiche ensuite mes tableaux pressed et latency mais ils contiennent que des 0.0000 :s
    j'ai fait des printf pour voir ou il rentre, et apparemment pour les événements des touches pressées et relachées le programme rentre dans le cas WM_COMMAND, j'ai essayé de mettres les cas WM_KEYUP et KEYDOWN dans celui-ci mais rien :s

    need help ^^

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Certaines touches sont interceptées par la boucle de messages de DialogBox.

    Si tu veux récupérer toutes les touches, tu peux utiliser CreateDialog() + Une boucle de message normale à la place...

    PS: Change le type de retour de ta dialogproc INT_PTR et supprime ton cast lors de l'appel de la fonction DialogBox : Un cast de pointeur de fonction, c'est toujours moche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    rolala dsl mais la j'ai rien compris :s.
    C'est un code que j'ai repris et j'ai jamais travailler avec l'API Win32 donc la je suis larguer, tu pourais me dire ou m'expliquer exactement ce qu'il faut faire stp ^^
    Merci d'avance.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    De toute façon, je m'étais trompé sur la première partie de ton message.

    Le problème est simple: Ce n'est pas la boîte de dialogue qui reçoit les messages de touches, c'est l'editbox dedans...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Salut,

    dans un dialogue on a souvent des "surprises" concernant la gestion des message, en particulier les evênements du clavier qui sont rarements récupérés là où on veut.

    En l'occurence, si tu as des fenêtres filles dans ton dialogue (c'est à dire au moins un contrôle) c'est la fenêtre active (celle qui a le focus) qui recoit les évènements.

    Tu peux cependant intercepter les messages dans ton objet CDialog AVANT qu'ils ne soient dispatchés aux fenêtres filles, en utilisant la fonction PreTranslateMessage.

    Regarde là: http://www.winterdom.com/dev/mfc/pretrans.html
    Et y a pas mal d'autres exemples en ligne.

    En tout cas j'avais fais comme ca et ca marche (MAIS, ca ne marche pas si ton dialogue est contenu dans un contrôle ActiveX, je précise si jamais tu es dans ce cas)

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    @ShevchenKik : Il ne s'agit pas ici d'une boîte de dialogue MFC, ce que tu dis ne peut donc pas s'y appliquer.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    @ShevchenKik : Il ne s'agit pas ici d'une boîte de dialogue MFC, ce que tu dis ne peut donc pas s'y appliquer.
    Arf effectivement j'ai lû un peu vite....dommage. N'y a-t-il pas d'équivalent à PreTranslateMessage pour un dialogue non MFC?

    Sinon il est peut être possible de passer par un hook (c'est ce que je fais dans mon cas "CDialog dans ActiveX", là je ne sais pas si ca peut s'appliquer mais comme tu m'as l'air bien calé....)?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je pense que pour ce genre de truc, ça ira plus vite de subclasser le contrôle EDIT pour qu'il forwarde ses messages à la boîte de dialogue...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Je pense que pour ce genre de truc, ça ira plus vite de subclasser le contrôle EDIT pour qu'il forwarde ses messages à la boîte de dialogue...
    En effet ca m'a l'air plus simple , rapide, efficace...quand je disais que t'avais l'air plutôt câlé....))

  13. #13
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je pense que pour ce genre de truc, ça ira plus vite de subclasser le contrôle EDIT pour qu'il forwarde ses messages à la boîte de dialogue...
    Ok et comment je fais ça :S, le controle Edit c'est le textEdit en gros ? et si c'est le cas comment je le subclasse?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu crées une nouvelle WindowProc pour ce contrôle et tu utilises SetWindowLongPtr() pour la lui mettre.
    Ta nouvelle WindowProc ne doit pas oublier d'appeler l'ancienne, en utilisant la fonction CallWindowProc().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Et j'ajoute: C'est loin d'être trivial. Si tu ne connais pas la programmation fenêtrée avec l'API Win32, je te conseille de ne pas aller plus loin avant d'avoir lu un tutoriel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    oh lala non ne t'inquiete pas j'ai juste besoin de cette partie pour récuperer les temps , ensuite c'est en C, je m'y connais beaucoup plus :S
    je vais essayer de faire ton truc mais bon j'ai pas super bien compris :p
    je vais voir je te tiens au courant

  17. #17
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    ra je suis larguer, tu pourais m'aider un peu medinoc ? j'ai pas envie de me battre avec un tuto juste pour ça :p j'aimerais bien un truc simple quoi, en plus le code qui était dans l'autre discussion c'est en c++ et pour le passer en C je sais pas ce qu'il faut changer ^^

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je viens de modifier le code pour qu'il s'adapte de lui-même au C et au C++.
    C'est un code que tu dois mettre en fichier d'en-tête, que tu inclus dans tes sources APRÈS windows.h quand tu as besoin de la fonction SetWindowLongPtr() dedans...

    Typiquement, la "base" du subclassing ressemble à ça :
    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
    WNDPROC g_oldEditProc;
    
    LRESULT NewEditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	/* Appel de l'ancienne proc */
    	CallWindowProc(g_oldEditProc, hWnd, uMsg, wParam, lParam);
    }
    
    INT_PTR CALLBACK CapturePassword(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	...
    
    		case WM_INITDIALOG:
    			...
    			g_oldEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PWEDIT), (LONG_PTR)NewEditProc);
    			...
    			break;
    	...
    }
    Ensuite, il faudra mettre les bonnes lignes dans NewEditProc() pour que l'edit modifiée prévienne la boîte de dialogue chaque fois qu'elle reçoit une touche...

    Mais si tu veux changer une edit d'un autre process, ça foirera.
    Si tu cherches à faire un keylogger, il te faudra utiliser les hooks, et je ne t'en dirai pas plus car c'est interdit par la charte du forum.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 126
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ensuite, il faudra mettre les bonnes lignes dans NewEditProc() pour que l'edit modifiée prévienne la boîte de dialogue chaque fois qu'elle reçoit une touche...
    alors cette partie la je l'ai pas bien compris, voilà ce que j'ai fait :

    j'ai fait un fichier LongPtr.h qui contient :
    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
    /* Définintions pour fonctions inline */
    #ifndef CCPP_INLINE
    #if defined(__cplusplus) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) || defined(__GNUC__)
    #define CCPP_INLINE inline
    #elif defined(_MSC_VER)
    #define CCPP_INLINE __inline
    #else
    #define CCPP_INLINE
    #endif
    #endif
    /* Définition pour cast: C ou C++ */
    #ifndef STATIC_CAST
    #ifdef __cplusplus
    #define STATIC_CAST(t, x) static_cast< t >(x)
    #else
    #define STATIC_CAST(t, x) ((t)(x))
    #endif
    #endif
     
    #ifdef GetWindowLongPtrW
    	//GetWindowLongPtr's are defines
    	#undef GetWindowLongPtrA
    	#undef GetWindowLongPtrW
    	#undef SetWindowLongPtrA
    	#undef SetWindowLongPtrW
    	
    	static CCPP_INLINE LONG_PTR GetWindowLongPtrA(HWND hWnd, int nIndex)
    	{ return STATIC_CAST(LONG_PTR, GetWindowLongA(hWnd, nIndex)); }
    	static CCPP_INLINE LONG_PTR GetWindowLongPtrW(HWND hWnd, int nIndex)
    	{ return STATIC_CAST(LONG_PTR, GetWindowLongW(hWnd, nIndex)); }
    	
    	static CCPP_INLINE LONG_PTR SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR lp)
    	{ return STATIC_CAST(LONG_PTR, SetWindowLongA( hWnd, nIndex, STATIC_CAST(LONG, lp) )); }
    	static CCPP_INLINE LONG_PTR SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR lp)
    	{ return STATIC_CAST(LONG_PTR, SetWindowLongW( hWnd, nIndex, STATIC_CAST(LONG, lp) )); }
     
    #endif
    ensuite dans mon fichier principal j'ai ça :
    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
    #ifdef WIN32
    
    #define WIN32_LEAN_AND_MEAN		/* Trim headers to only most commonly used stuff */
    #include <windows.h>			/* Include Win API for password dialog			 */
    #include "resource.h"			/* Include dialog resource definitions			 */
    #include <time.h>
    #include <windows.h>
    #include "LongPtr.h"
    clock_t
         temps_initial, /* Temps initial en micro-secondes */
         temps_final,   /* Temps final en micro-secondes */
         temps_tmp;
    float
        temps_cpu;     /* Temps total en secondes */ 
    
    /*-----------------------------------------*
     *	Callback for Dialog box event handling *
     *-----------------------------------------*/
    LRESULT NewEditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uMsg)
    	{
    		case WM_KEYDOWN: 
    
    			printf("down\n");
    			temps_initial = clock ();
    			if(iter==1){
    				latency[indexLatency++]=(temps_initial-temps_tmp);
    			}
    			temps_tmp=temps_initial;
    			iter=1;
    			break;
    		case WM_KEYUP: 
    
    			printf("up\n");
    			temps_final = clock ();
    			temps_cpu = (temps_final - temps_initial);
    			pressed[indexPressed++]=temps_cpu;
    			break;
    	}
    	/* Call the old proc */
    	CallWindowProc(g_oldEditProc, hWnd, uMsg, wParam, lParam);
    }
    
    LONG_PTR CALLBACK CapturePassword(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	RECT rcDlg, rcDesktop;
    
    	switch (message)
    	{
    		/*	This message is sent when the dialog gets created */
    		case WM_INITDIALOG:
    			printf("init\n");
    			GetWindowRect(GetDesktopWindow(), &rcDesktop);
    			GetWindowRect(hwndDlg, &rcDlg);
    
    			/* Center Dialog on the desktop */
    
    			SetWindowPos(hwndDlg,
    				HWND_TOP,
    				rcDesktop.right/2  - ((rcDlg.right	 - rcDlg.left)	/ 2),
    				rcDesktop.bottom/2 - ((rcDlg.bottom	 - rcDlg.top)	/ 2),
    				0, 0,  /* ignores size arguments; no resize desired */
    				SWP_NOSIZE);
    
    			/* Start dialog with focus in the password edit box */
    			SetFocus(GetDlgItem(hwndDlg, IDC_PWEDIT));
    			g_oldEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PWEDIT),GWL_USERDATA, (LONG_PTR)NewEditProc);
    			break;
    		
    		case WM_COMMAND:
    			printf("comm\n");
    			switch (LOWORD(wParam))
    			{
    				case IDOK:
    					/*	Dump the password into BSP memory */
    					if (!GetDlgItemText(hwndDlg, IDC_PWEDIT, inputPassword1,
    							MAX_PASSWORD_SIZE + 1))
    						/* if call fails, null out the password cache */
    						*inputPassword1=0;
    
    				/* fall through after ok is pressed */
    				case IDCANCEL:
    					EndDialog(hwndDlg, wParam);
    					return TRUE;
    			}
    	}
    	return FALSE;
    }
    
    #endif // WIN32 defined for password dialog callback
    et l'appelle se fait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dllHandle = LoadLibrary(BSP_SELF_CHECK_SECTION);
    if (IDOK != (dialogRetVal = DialogBox(
    						dllHandle,	MAKEINTRESOURCE(IDD_PWDIALOG),
    						NULL,		(DLGPROC)CapturePassword)))
    	{
    		/* Operation failed; password wasn't captured */
    		 return (BioAPIERR_BSP_UNABLE_TO_CAPTURE);
    	}
    avec ces changements, je ne rentre toujours pas dans les cas de la newEditProc par contre je fait toujours les autres :S

    PS dans cette ligne la il manquait un argument alors j'ai mis comme dans l'exemple sur l'autre discussion mais je ne suis pas sur du tout ^^ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    g_oldEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PWEDIT),GWL_USERDATA, (LONG_PTR)NewEditProc);

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ah, oui.
    J'ai oublié cet argument.
    Tu dois mettre GWLP_WNDPROC.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. api win32 DialogBox
    Par spunk62 dans le forum Visual C++
    Réponses: 5
    Dernier message: 11/06/2009, 20h17
  2. [API WIN32] Double problème: DialogBox && Statusbar
    Par Ackboo dans le forum Windows
    Réponses: 9
    Dernier message: 20/08/2006, 13h15
  3. [API WIN32] Pb avec SHGetSpecialFolderLocation
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 21h19
  4. API Win32
    Par benoit70 dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 19h11
  5. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h38

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