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

Visual C++ Discussion :

Utilisation de keybd_event et PostKeybdMessage


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 37
    Points
    37
    Par défaut Utilisation de keybd_event et PostKeybdMessage
    Bonjour je travaille actuellement sur un projet ou je reprend une partie de code.

    Pour info je travaille sur Microsoft eMbedded Visual C++ 4.0.

    J'ai voulu rajouter une partie qui permet de simuler un appui de touche au clavier.

    Alors j'utilise un Carray de CString qui me garde en mémoire mes action. Par exemple si il y a Droite dans le tableau je vais simuler l'appuie sur la touche droite avec la fonction keybd_event.

    Mon programme fonctionne parfaitement quand il sagit de simuler l'appuie sur les touches de direction (flêches bas gauche droite et haut), mais a un problème quand j'utilise la fonction PostKeybdMessage pour faire passer des lettres a mon programme. En gros cette fonction qui doit simuler l'appuie sur des lettres est toujours prise en premier quelque soit l'ordre du mot date dans mon programme.

    Pour faire plus clair je joint le code de ma routine.


    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    void CKeyWedgeDlg::Routine()
    {
     
    	BOOL bResult;
    	HWND hwnd = (HWND)-1;
    	BYTE *pData;
    	KEY_STATE_FLAGS kstate[1];
    	UINT vKey;
    	BYTE scanPlusFormatData[ MAX_BARCODE_LEN + 80 ];
     
    	CTime theTime = CTime::GetCurrentTime();
     
    	if (compteurelemtab>=DialogOption.elemtab.GetSize()-1) compteurelemtab=0;	//Remise à zéro du compteur sur elemtab
     
     
    		for (compteurelemtab;compteurelemtab<DialogOption.elemtab.GetSize();compteurelemtab++)
    		{
    			CString stringelem = DialogOption.elemtab[compteurelemtab];
    			stringelem.MakeUpper();
     
     
    			if (stringelem.Compare(_T("DROITE"))==0)
    			{
     
     
    				keybd_event( VK_RIGHT, 0, KEYEVENTF_SILENT, 0 ); // RIGHT key down
    				keybd_event( VK_RIGHT, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // RIGHT  key up
    				Sleep(50);
    			}
     
    			else if (stringelem.Compare(_T("GAUCHE"))==0)
    			{
    				//AfxMessageBox(_T("GAUCHE"), MB_OK, NULL);
     
    				keybd_event( VK_LEFT, 0, KEYEVENTF_SILENT, 0 ); // LEFT key down
    				keybd_event( VK_LEFT, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // LEFT  key up
    				Sleep(50);
    			}
     
    			else if (stringelem.Compare(_T("BAS"))==0)
    			{
    				//	AfxMessageBox(_T("BAS"), MB_OK, NULL);
    				keybd_event( VK_DOWN, 0, KEYEVENTF_SILENT, 0 ); // DOWN key down
    				keybd_event( VK_DOWN, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // DOWN  key up
    				Sleep(50);
    			}
     
    			else if (stringelem.Compare(_T("HAUT"))==0)
    			{
    				//	AfxMessageBox(_T("HAUT"), MB_OK, NULL);
    				keybd_event( VK_UP, 0, KEYEVENTF_SILENT, 0 ); // UP key down
    				keybd_event( VK_UP, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // UP  key up
    				Sleep(50);
    			}
     
    			else if (stringelem.Compare(_T("DATE"))==0)
    			{
     
    			//	AfxMessageBox(_T("DATE"), MB_OK, NULL);
    				CTime theTime = CTime::GetCurrentTime();
     
    				int day,month,year;
     
    				day = theTime.GetDay();
    				month = theTime.GetMonth();
    				year = theTime.GetYear();
     
    				memset(scanPlusFormatData, '\0', MAX_BARCODE_LEN + 80); //initialize to all nulls
    				pData = scanPlusFormatData;
    				sprintf((char*)pData, "=DATE(%d;%d;%d)", (year%100)+100,month,day);
     
    				// For each character in the string
    				while( *pData != '\0' )
    				{
    					switch( *pData )
    					{
    					case '!':
    						keybd_event( VK_SHIFT, 0, KEYEVENTF_SILENT, 0 ); // SHIFT key down
    						keybd_event( '1', 0, 0, 0 );
    						keybd_event( '1', 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 );
    						keybd_event( VK_SHIFT, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // SHIFT key up
    						break;
     
    					case '@':
    						keybd_event( VK_SHIFT, 0, KEYEVENTF_SILENT, 0 ); // SHIFT key down
    						keybd_event( '2', 0, 0, 0 );
    						keybd_event( '2', 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 );
    						keybd_event( VK_SHIFT, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // SHIFT key up
    						break;
     
    					case '#':
    						keybd_event( VK_SHIFT, 0, KEYEVENTF_SILENT, 0 ); // SHIFT key down
    						keybd_event( '3', 0, 0, 0 );
    						keybd_event( '3', 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 );
    						keybd_event( VK_SHIFT, 0, (KEYEVENTF_KEYUP|KEYEVENTF_SILENT), 0 ); // SHIFT key up
    						break;
     
    					default:
    						vKey = (UINT)*pData;
    						bResult = PostKeybdMessage(hwnd, vKey, kstate[0], 1, kstate, &vKey);
    						if(bResult) {
    							keybd_event(0,0,1,0);
    						}
    					}
    					// Now move on to the next character
    					pData++;
    					Sleep(1);
    				} // end while (*pData != '\0')
     
    			}
    			else if (stringelem.Compare(_T("STOP"))==0)
    			{
    				compteurelemtab++;
    				return;
    			}
     
     
     
    		}
     
    }
    En gros le dernier cas if (stringelem.Compare(_T("DATE"))==0) passe toujours en premier quelque soit l'ordre... Donc j'ai regarder dans la msdn et je n'ai pas trouvé pk ... J'ai l'impression que les keybd_event sont mis en mémoire et lancer qu'une fois que l'on sort de ma routine ... Et dans ce cas le PostKeybdmessage passe en premier...

    Enfin je sais pas.

    Pouvez vous m'aider ??

    Merci de vos réponses.

  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, je n'ai pas le temps de regarder, mais as-tu jeté un oeil à la faq ? http://c.developpez.com/faq/vc/?page...mulateKeyBoard

    ps : envoyer un message clavier ne veut pas dire le simuler automatiquement, c'est la fenetre des messages qui sera à meme de gerer les touches en temps voulu

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Points : 37
    Points
    37
    Par défaut
    Oui c'est ce que j'ai compris et du coup cette fenêtre m'écrit mon texte avant le reste.
    Ce n'est pas grave je vais trouver comment faire

    Merci en tout cas de ton aide vais m'inspirer de la faq.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2008, 13h30
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 16h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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