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 ?
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 ?
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.
ok merci trop de la balle ^^
sorry mais ca ne marche pas mes tableaux ne se remplissent pas :s
voila mon code qui lance ma dialogue Box :
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 DialogBox(dllHandle, MAKEINTRESOURCE(IDD_PWDIALOG), NULL, (DLGPROC)CapturePassword);
j'affiche ensuite mes tableaux pressed et latency mais ils contiennent que des 0.0000 :s
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'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 ^^
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.
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.
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.
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)
@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.
Arf effectivement j'ai lû un peu vite....dommage. N'y a-t-il pas d'équivalent à PreTranslateMessage pour un dialogue non MFC?@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.
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é....)?
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.
En effet ca m'a l'air plus simple , rapide, efficace...quand je disais que t'avais l'air plutôt câlé....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...))
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.
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.
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
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 ^^
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 :
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...
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; ... }
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.
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 :
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 /* 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
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
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
avec ces changements, je ne rentre toujours pas dans les cas de la newEditProc par contre je fait toujours les autres :S
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); }
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);
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager