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

Langage Delphi Discussion :

Ma tablette a-t-elle un clavier ?


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut Ma tablette a-t-elle un clavier ?
    Bonjour

    Sous XE3, j'avais fait une application metropolis pour Windows en Firemonkey.
    Cette application tourne des tablettes samsung qui sont affublées d'un clavier détachable.

    Je cherche désespérément une façon de détecter si le clavier physique est disponible ou pas mais je ne trouve rien.

    Quelqu'un aurait-il une idée sur le sujet ?

    Papy !
    J-L aka Papy pour les amis

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    je ne retrouve pas le code mais il a été mis sur le forum, via les WMI on peut détecter le clavier Win32_Keyboard class
    Est-ce que dans une application FMX, tu peux glisser des appels au WMI, normalement, oui, mais faut juste bien l'écrire avec une pattern strategy
    voir les codes de FMX qui sont un parfait exemple comme avec l'implémentation de IFMXMouseService dans TPlatformCocoa et TPlatformWin
    Avec un jeu de directive, tu inclus l'une ou l'autre unité d'implémentation d'une IFMXKeyBoardService ... c'est curieux que cela n'existe pas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    En générale, on ne détecte le clavier que quand une touche est pressée. Un clavier bluetooth pourrait être "connecté" (in-range) sans qu'on veuille pour autant l'utiliser.

    Pour cela, on passe par RawInput et teste hDevice. S'il est différent de 0, c'est un clavier physique.

    Sous FMX, à voir..

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    RawInput ! C'est ça, j'ai confondu !
    Je savais bien qu'il y avait eu un code sur une gestion multi-clavier, comme pour différencier un clavier d'une douchette

    Citation Envoyé par Andnotor Voir le message
    Sous FMX, à voir..
    Si l'on veut être multi-plateforme et tant que l'on respecte un code avec un couplage faible avec Interface et Implémentations multiples comme le fait TPlatformServices, cela ne pose aucun problème.

    Faudrait regarder IFMXDeviceService pour t'inspirer d'un code multi-plateforme, pour Windows tu utilises RawInput, pour le reste tu fournis une implémentation par défaut qui retourne False à défaut de mieux

    Exemple d'un appel à l'une des interfaces de TPlatformServices qui détecte si l'on est en Desktop, Phone, Tablet, Watch, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      DeviceService: IFMXDeviceService;
    begin
        if TPlatformServices.Current.SupportsPlatformService(IFMXDeviceService, IInterface(DeviceService)) then
        begin
          case DeviceService.GetDeviceClass() of
            Desktop: ...;
            Phone: ...;
            Tablet: ...;
            Watch: ...;
            ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    Tout d'abord, merci pour ces infos !

    Le multi plateformes n'est pas mon objectif pour cette application qui ne tourne que sous Windows.

    Je viens de regarder le code exemple avec rawinput mais il nécessite la JCL.
    De plus, il traite plutôt la frappe de touche pour détecter dynamiquement le périphérique d'entrée et faire un filtrage.
    C'est du moins ce que j'ai cru comprendre.

    Ce qu'il me faut plutôt c'est un bout de code qui me renvoie un genre ClavierPhysiqueAttaché qui répondrait vrai si l'utilisateur a bien lié sa tablette au claver physique.
    Il semble que ça soit possible avec WMI en vérifiant win32_Keyboard qui renvoie la liste des claviers disponibles.
    Le clavier de la tablette en question (modèle identique pour chaque utilisateur) est reconnu comme clavier USB.
    En vérifiant le DeviceID je peux savoir si le clavier physique est dispo. SI je trouve un USB\UIDxxxxxxxx , c'est ok.

    Je me base sur https://blogs.technet.microsoft.com/...eyboard-mouse/


    Je vais me tourner vers solution qui répond plus à mon besoin actuel.

    Bonne journée
    J-L aka Papy pour les amis

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut La solution pour moi
    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
     
    unit WMI_Win32_KeyboardInfo;
     
    interface
     
    uses
      SysUtils, ActiveX, ComObj, Variants, System.Generics.Collections, FMX.Dialogs, System.UITypes;
     
    function PhysicalKeyboardEnabled: Boolean;
     
    implementation
     
    type
     
      TWMI_KeyboardInfo = record
        Description, DeviceID, PNPDeviceID: string;
      end;
     
      TWMI_KeyboardInfoList = TList<TWMI_KeyboardInfo>;
     
      // La classe Win32_Keyboard représente un clavier installé sur un système Win32.
      // Exemple*: Un clavier Microsoft Natural(R) Keyboard
     
    procedure GetWin32_KeyboardInfo(WMI_KeyboardInfoList: TWMI_KeyboardInfoList);
    const
      WbemUser = '';
      WbemPassword = '';
      WbemComputer = 'localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator: OLEVariant;
      FWMIService: OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject: OLEVariant;
      oEnum: IEnumvariant;
      iValue: LongWord;
      K: TWMI_KeyboardInfo;
    begin;
     
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet := FWMIService.ExecQuery('SELECT * FROM Win32_Keyboard', 'WQL', wbemFlagForwardOnly);
      oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumvariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        K.Description := String(FWbemObject.Description);
        K.DeviceID := String(FWbemObject.DeviceID);
        K.PNPDeviceID := String(FWbemObject.PNPDeviceID);
        WMI_KeyboardInfoList.Add(K);
        FWbemObject := Unassigned;
      end;
    end;
     
    function PhysicalKeyboardEnabled: Boolean;
    var
      WMI_KeyboardInfoList: TWMI_KeyboardInfoList;
      Kb: TWMI_KeyboardInfo;
    begin
      Result := False;
      WMI_KeyboardInfoList := TWMI_KeyboardInfoList.Create;
      GetWin32_KeyboardInfo(WMI_KeyboardInfoList);
      for Kb in WMI_KeyboardInfoList do
      begin
        if Pos('USB', Kb.PNPDeviceID) > 0 then
        begin
          Result := True;
          Break;
        end;
      end;
      WMI_KeyboardInfoList.Free;
    end;
     
    end.
    J-L aka Papy pour les amis

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    tu aurais peut être plus simplifié ton WQL et donc ton traitement

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select DeviceID,Name from Win32_Keyboard
    WHERE DeviceID like "%USB%"
    et ainsi tu sais si tu as un clavier USB si ton résultat est non null

    Rem. Le LIKE est à peaufiner, mais comme je n'ai ni tablette ni clavier usb .....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 441
    Points : 3 076
    Points
    3 076
    Par défaut
    C'est pas faux ! En fait, j'ai pris directement le code généré par le très bon outil WMI Delphi code creator.
    Je n'ai pas approfondi.
    Merci pour cette remarque pertinente.
    J-L aka Papy pour les amis

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    En fait, j'ai pris directement le code généré par le très bon outil WMI Delphi code creator.
    et moi je n'ai fait que prendre ce même outil pour tester cette requête
    le plus dur étant de trouver la syntaxe possible de la clause WHERE car WQL n'est quand même pas SQL ! je me demande même si la casse des noms de colonne n'est pas à prendre en compte
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Réponses: 36
    Dernier message: 03/09/2013, 18h05
  2. Réponses: 59
    Dernier message: 24/11/2010, 12h35
  3. Réponses: 47
    Dernier message: 06/05/2010, 15h07
  4. La guerre des tablettes aura-t-elle lieu ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 3
    Dernier message: 06/10/2009, 10h26
  5. Les tablettes graphiques sont-elles confortables d'utilisation ?
    Par keokaz dans le forum Périphériques
    Réponses: 8
    Dernier message: 10/03/2009, 20h00

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