Bonjour,
j'intercepte les message windows afin d'obtenir la saisie d'un lecteur code barre,
je cherche comment obtenir le code caractere du VK_KKChose
exemple : VK_NUMPAD8 -> '8' et ce pour tout les caracteres VK_....
Merci
Bonjour,
j'intercepte les message windows afin d'obtenir la saisie d'un lecteur code barre,
je cherche comment obtenir le code caractere du VK_KKChose
exemple : VK_NUMPAD8 -> '8' et ce pour tout les caracteres VK_....
Merci
tu veux la liste des correspondances c'est ca ? si oui, c'est dans msdn
si non, j'ai pas compris la question
il faut faire a la main ?
y'a pas de fonction pour faire ca ?
faut reellement faire comme ca :
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 BOOL DlScanner::PreTranslateMessage(MSG* pMsg) { if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche { // Ecart maximal de 250 ms entre chaque touche sinon on vide le buffer DWORD dwNow = GetTickCount(); if ( (dwNow - p_dwLastInput) > 250 ){ p_KeyInput = ""; p_dwLastInput = dwNow; } TRACE("%c : %d \n\r", pMsg->wParam,pMsg->wParam); // winuser.h // VK_NUMPAD0 -> VK_NUMPAD9 if ( (pMsg->wParam >= 0x60) && (pMsg->wParam <= 0x69 )) { p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0'); return TRUE; // fin de l'analyse du message } // ascii else if ( (pMsg->wParam >= 32) && (pMsg->wParam <= 128)) { p_KeyInput.AppendFormat("%c", pMsg->wParam); return TRUE; // fin de l'analyse du message } else if (pMsg->wParam == VK_RETURN) // touche [ ENTER ] { if (p_KeyInput != "") { AnalyseCodeBarre(p_KeyInput); } p_KeyInput = ""; return TRUE; // fin de l'analyse du message } } return CDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité }
remarquez,
ce code est faux car comment savoir qu'il s'agit du code VK_NUMPAD1 est non du caractere ASCII 'a'
OK, je capte, en fait j'avais mal interpreté le message WM_KEYDOWN
Lui ne retourne que les codes virtuels, et quand le terminal de scan retourne de l'ascii, c'est avec WM_CHAR
du coup, le code suivant semble fonctionner avec les differentes douchettes code-barres que j'ai :
Alors, en test, on a ou WM_CHAR ou WM_KEYDOWN, ma question : ce sera toujours comme ca, ou les 2 peuvent intervenir ? et du coup, j'aurai une double lecture
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 BOOL DlScanner::PreTranslateMessage(MSG* pMsg) { if ( pMsg->message == WM_CHAR ) // evenement = pression d'une touche { // Ecart maximal de 100 ms entre chaque touche sinon on vide le buffer DWORD dwNow = GetTickCount(); if ( (dwNow - p_dwLastInput) > 1000 ){ p_KeyInput = ""; p_dwLastInput = dwNow; } // winuser.h p_KeyInput.AppendFormat("%c", pMsg->wParam); TRACE("KEY : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput); return TRUE; // fin de l'analyse du message } else if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche { // Ecart maximal de 100 ms entre chaque touche sinon on vide le buffer DWORD dwNow = GetTickCount(); if ( (dwNow - p_dwLastInput) > 1000 ){ p_KeyInput = ""; p_dwLastInput = dwNow; } // winuser.h // VK_NUMPAD0 -> VK_NUMPAD9 if ( (pMsg->wParam >= 0x60) && (pMsg->wParam <= 0x69 )) { p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0'); TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput); return TRUE; // fin de l'analyse du message } // VK_A - VK_Z else if ( (pMsg->wParam >= 0x41) && (pMsg->wParam <= 0x5A )) { p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'A'); TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput); return TRUE; // fin de l'analyse du message } else if (pMsg->wParam == VK_RETURN) // touche [ ENTER ] { if (p_KeyInput != "") { AnalyseCodeBarre(p_KeyInput); } p_KeyInput = ""; TRACE("DOWN : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput); return TRUE; // fin de l'analyse du message } } return CDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité }
salut,
le 'sens' du message est clair :
keydown c'est sur l'appui d'une touche.
wm_char c'est sur la réception d'un caractère.
d'un coté on parle de touche enfoncée ,de l'autre de caractère reçu ...
leur usage est différent et il est évident que si tu traites les deux messages tu auras deux fois la réponse..
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
Slt Farscape,
c'est ce que je pensais, et portant ce n'est pas le cas, que ce soit de la saisie par le terminal de lecture de code-barres ou par le clavier que je le fais,
Je n'ai qu'un cas ou l'autre et du coup, mon CString p_KeyInput est nickel, qu'en penses tu ?
ci-après mon code actuel de réception :
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 BOOL DlScanner::PreTranslateMessage(MSG* pMsg) { if ( pMsg->message == WM_CHAR ) // evenement = pression d'une touche { // Ecart maximal de 500 ms entre chaque touche sinon on vide le buffer DWORD dwNow = GetTickCount(); if ( (dwNow - p_dwLastInput) > 500 ){ p_KeyInput = ""; p_dwLastInput = dwNow; } // winuser.h p_KeyInput.AppendFormat("%c", pMsg->wParam); TRACE("KEY : %c - %d - %s \n\r", pMsg->wParam,pMsg->wParam, p_KeyInput); return TRUE; // fin de l'analyse du message } else if ( pMsg->message == WM_KEYDOWN ) // evenement = pression d'une touche { // Ecart maximal de 500 ms entre chaque touche sinon on vide le buffer DWORD dwNow = GetTickCount(); if ( (dwNow - p_dwLastInput) > 500 ){ p_KeyInput = ""; p_dwLastInput = dwNow; } // winuser.h // VK_NUMPAD0 -> VK_NUMPAD9 if ( (pMsg->wParam >= 0x60) && (pMsg->wParam <= 0x69 )) { p_KeyInput.AppendFormat("%c", pMsg->wParam - VK_NUMPAD0 + '0'); } // VK_0 - VK_9 else if ( (pMsg->wParam >= 0X30) && (pMsg->wParam <= 0x39 )){ p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x30 + '0'); } // VK_A - VK_Z else if ( (pMsg->wParam >= 0x41) && (pMsg->wParam <= 0x5A )){ if ( (GetKeyState(VK_SHIFT)) ^ (GetKeyState(VK_CAPITAL)) ){ p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'A'); } else{ p_KeyInput.AppendFormat("%c", pMsg->wParam - 0x41 + 'a'); } } else if (pMsg->wParam == VK_RETURN){ // touche [ ENTER ] if (p_KeyInput != ""){ AnalyseCodeBarre(p_KeyInput); } p_KeyInput = ""; } else if (pMsg->wParam == VK_SPACE){ p_KeyInput.Append(" "); } else if (pMsg->wParam == VK_MULTIPLY){ p_KeyInput.Append("*"); } else if (pMsg->wParam == VK_ADD){ p_KeyInput.Append("+"); } else if (pMsg->wParam == VK_SUBTRACT){ p_KeyInput.Append("-"); } else if (pMsg->wParam == VK_DECIMAL){ p_KeyInput.Append("."); } else if (pMsg->wParam == VK_DIVIDE){ p_KeyInput.Append("/"); } return TRUE; } return CDigiDialog::PreTranslateMessage(pMsg); // retransmission du message si non traité }
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