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

C++ Discussion :

Environnement matériel pour une application Windows 10


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 40
    Par défaut Environnement matériel pour une application Windows 10
    Bonjour à tous,

    J'ai fait une application qui peut être exécuté aussi bien sur tablette que sur pc portable ou de bureau.
    Elle fonctionne sur Windows 10.
    Le clavier virtuel étant ce qu'il est sur Windows 10 (il apparait quand il veut bien) et pas possible à ma connaissance d'orienter la saisie sur du pur numérique ou sur de l'alpha-numérique, j'y ai inclus donc un clavier virtuel (PopupVirtualKeyboard).
    Mais avant de le faire apparaitre et de le gérer, il faut que je sache si un clavier physique est présent ou non.
    J'ai donc regardé sur le Net et ai trouvé cela :
    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
    bool KB=false;
    UINT nDevices,nbdev,i;
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    tagRAWINPUTDEVICELIST org;
    	GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	pRawInputDeviceList = (tagRAWINPUTDEVICELIST *) malloc(sizeof(RAWINPUTDEVICELIST) * nDevices);
    	nbdev=GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	for (i = 0; i < nbdev; i++) {
    		org=pRawInputDeviceList[i];
    		if (org.dwType==RIM_TYPEKEYBOARD) {
    			KB=true;
    			break;
    		}
    	}
    	free(pRawInputDeviceList);
    	if (KB) {
    		ShowMessage("Un clavier physique a été trouvé");
    	}
    	return KB;
    Malheureusement il détecte le clavier aussi bien sur le PC que sur la tablette !.
    Quelqu'un aurait-il d'autres API ou fonctions adaptées à mon cas (et sans doute bien d'autres) ?
    Je développe sous C++Builder XE6.

    D'avance Merci.

  2. #2
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Par défaut
    Si org.dwType==RIM_TYPEKEYBOARD, alors org.keyboard.dwType et org.keyboard.dwSubType
    détailleront le type et le sous-type du clavier.

    https://docs.microsoft.com/en-us/win...id_device_info
    https://docs.microsoft.com/en-us/win..._info_keyboard

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 40
    Par défaut
    Merci kaitlyn de votre réponse.
    Je regarde cela demain et vous tient au courant.
    Bonne soirée

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 40
    Par défaut
    Bonjour à tous,

    J'ai donc fait deux tests mais non concluants :
    j'ai regardé la structure RID_DEVICE_INFO à l'initialisation du programme. Erreur :
    Nom : 2020-02-14_17-08-10.png
Affichages : 337
Taille : 10,6 Ko

    J'en ai donc conclu que la structure n'était pas remplie et j'ai donc utilisé la fonction GetRawInputDeviceInfoA pour ce faire avec le code suivant :
    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
    bool __fastcall TMain::IsKeyboardPresent(void) {
    bool KB=false;
    UINT nDevices,nbdev,i,ret;
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    RID_DEVICE_INFO * rdi;
    RID_DEVICE_INFO_KEYBOARD rdik;
    tagRAWINPUTDEVICELIST org;
    DWORD le;
    
    	GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	pRawInputDeviceList = (tagRAWINPUTDEVICELIST *) malloc(sizeof(RAWINPUTDEVICELIST) * nDevices);
    	rdi = (RID_DEVICE_INFO *)malloc(sizeof(RID_DEVICE_INFO));
    	nbdev=GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	for (i = 0; i < nbdev; i++) {
    		org=pRawInputDeviceList[i];
    		if (org.dwType==RIM_TYPEKEYBOARD) {
    			ret=GetRawInputDeviceInfoA(org.hDevice,RIDI_DEVICEINFO,rdi,(PUINT)sizeof(rdi));
    			le=GetLastError();
    			KB=true;
    			break;
    		}
    	}
    	free(pRawInputDeviceList);
    	free(rdi);
    	if (KB) {
    		ShowMessage("Un clavier physique a été trouvé");
    	}
    	return KB;
    }
    et le résultat n'est pas satisfaisant puisque j'ai une erreur système 998 (ERROR_NOACCESS 998 (0x3E6) Invalid access to memory location.)
    De plus, la structure 1 ou 2 n'indique pas clairement l'état physique hardware d'un clavier.

    On peut toujours utiliser l'interruption 16h pour répondre mais bon, il doit y avoir plus simple...

    Avez-vous une idée pour savoir si une application peut utiliser un clavier physique ou non ? et plus généralement, quels sont les devices disponibles sur le PC : clavier, souris, microphone, appareil photo, etc...

    D'avance Merci de votre réponse.

  5. #5
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Par défaut
    Oui, petite confusion entre les deux RIM_TYPEKEYBOARD des deux structures, désolée que ça vous ait induit en erreur.
    RID_DEVICE_INFO se peuple avec GetRawInputDeviceInfo(), et s'utiliserait comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    RID_DEVICE_INFO device;
     
    //la boucle (idéalement un "range based for loop" sur vecteur pour la façon C++, XE6 semble le permettre)
     
    if (org.dwType==RIM_TYPEKEYBOARD) {
      device.cbSize= sizeof(device);
      UINT cbSize= sizeof(device);
      if (::GetRawInputDeviceInfo(org.hDevice, RIDI_DEVICEINFO, &device, &cbSize) > 0) { 
        //affichage des infomations, préférablement sur la console, lors d'expérimentations : 
        //  device.keyboard.dwType
        //  device.keyboard.dwSubType
        //  ...
        //ne pas interrompre la boucle, il peut y avoir plus d'un type de clavier...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 40
    Par défaut
    Merci kaitlyn mais cela ne fonctionne pas. Je pense que ce sont des API obsolètes puisque sur la tablette, le programme me trouve des touches. De plus, comment avoir deux claviers sur un PC ?
    Voici le programme :
    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
    bool __fastcall TMain::IsKeyboardPresent(void) {
    bool KB=false;
    UINT nDevices,nbdev,i,ret,cbSize;
    DWORD le;
    tagRAWINPUTDEVICELIST org;
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    RID_DEVICE_INFO rdi;
     
    	GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	pRawInputDeviceList = (tagRAWINPUTDEVICELIST *) malloc(sizeof(RAWINPUTDEVICELIST) * nDevices);
    	nbdev=GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST));
    	for (i = 0; i < nbdev; i++) {
    		org=pRawInputDeviceList[i];
    		if (org.dwType==RIM_TYPEKEYBOARD) {
    			rdi.cbSize= sizeof(RID_DEVICE_INFO);
    			cbSize= sizeof(RID_DEVICE_INFO);
    			::GetRawInputDeviceInfo(org.hDevice, RIDI_DEVICEINFO, &rdi, &cbSize);
    			le=GetLastError();
    		}
    	}
    	KB=(le==0 && rdi.keyboard.dwNumberOfKeysTotal>0);
    	free(pRawInputDeviceList);
    	return KB;
    }
    J'abandonne cette foutue API et continue mes recherches. Il doit quand même y avoir des APIs ou autres qui permettent de dresser la configuration matérielle du PC utilisateur ????

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/03/2013, 17h33
  2. Réponses: 4
    Dernier message: 10/03/2011, 17h28
  3. Logiciel Help pour une application Windows
    Par faidimery dans le forum Windows
    Réponses: 0
    Dernier message: 27/01/2010, 16h21
  4. Interface défini en XML pour une application windows ?
    Par 6su7 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 16/11/2009, 11h34
  5. Test automatisé pour une application Windows Forms
    Par Mat_76 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/08/2009, 15h37

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