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

Lazarus Pascal Discussion :

Comportement différent de GetKeyShiftState selon l'OS


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut Comportement différent de GetKeyShiftState selon l'OS
    Bonjour à toutes et à tous,

    Toujours dans mon application pour assembler des images sur le WEB, j'utilise un timer pour scruter cycliquement les touches appuyées.

    J'utilise la fonction GetKeyShiftState qui me permet de capter l'appui sur les touches Ctrl et Alt.

    Sous Windows, que mon application soit au premier plan ou non, cette fonction capte l'appui sur ces touches.

    Sous Linux, il faut que mon application soit au premier plan pour que je capte ces touches, ce qui ne me convient pas.

    NOTA : j'avais créé une fonction basée sur GetKeyShiftState me permettant de capter les boutons de la souris : elle fonctionne quel que soit l'OS même si mon application n'est pas au premier plan.

    Connaissez-vous une méthode pour capter ces touches, quel que soit l'OS, même si mon application n'est pas au premier plan.

    Cordialement.

    Pierre

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 353
    Points
    4 353
    Billets dans le blog
    2
    Par défaut
    Re Bonjour
    Tu peux utiliser la même astuce que la fonction que tu as créé

    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
    uses
      lcltype, lclintf, classes
    {$IFDEF MSWINDOWS}
      ,Windows
    {$ELSE}
      {$IFDEF LINUX}
       ,x, xlib, KeySym
      {$ENDIF}
      {$IFDEF DARWIN}
      {$ENDIF}
    {$ENDIF} ;
     
    type
       TVirtualKeyCode = Integer;
     
    const
       // pseudo wheel keys (we squat F23/F24), see KeyboardNotifyWheelMoved
       VK_MOUSEWHEELUP   = VK_F23;
       VK_MOUSEWHEELDOWN = VK_F24;
     
    var
       vLastWheelDelta : Integer;
     
    { IsKeyDown : Vérifie si la touche correspondant au "char" donné est appuyé.
    **Le caractère est mappé sur le "clavier principal"  uniquement, et non sur le clavier numérique.(virtuel)
    **Les combinaisons Shift / Ctrl / Alt qui peuvent être nécessaires pour taper
    **le caractère sont ignorés (c.-à-d. 'a' équivaut à 'A' et sur mon clavier français
    **'5' = '(' = '[' car ils ont tous le même Code de touche physique).
    }
    function IsKeyDown(C:Char):Boolean;
    begin
      c := UpperCase(c)[1];
      Result := GetKeyState(Ord(c)) < 0;
    End;
     
    { IsKeyDown : Vérifie si la touche correspondant au "Code Virtuel" donné est appuyé.
      Cette fonction est juste là pour englober GetKeyState.
    }
    function IsKeyDown(vk : TVirtualKeyCode) : Boolean;
    begin
       case vk of
          VK_MOUSEWHEELUP:
          begin
             Result := vLastWheelDelta > 0;
             if Result then
               vLastWheelDelta := 0;
          end;
     
          VK_MOUSEWHEELDOWN:
          begin
             Result := vLastWheelDelta < 0;
             if Result then
               vLastWheelDelta := 0;
          end;
       else
          Result := GetKeyState(vk) < 0;
       end;
    end;
     
    {  KeyboardNotifyWheelMoved : Utilisez cette procédure pour informer le mouvement de la roue de la souris
      et simuler l'appui d'une touche (VK_MOUSEWHEELUP/VK_MOUSEWHEELDOWN), qui sera intercepté par IsKeyDown et/ou KeyPressed
      A placer dans les évènement OnMouseWheel des controles graphique (form, tpanel ect...)
    }
    procedure KeyboardNotifyWheelMoved(wheelDelta : Integer);
    begin
       vLastWheelDelta:=wheelDelta;
    end;
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //si CTRL+a ou CTRL+A
    if (IsKeyDown(VK_CONTROL) and IsKeydown(VK_A)) then....
    Bonne fin de soirée

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    ... Tu peux utiliser la même astuce que la fonction que tu as créée ...
    Merci BeanzMaster pour ce morceau de code.

    Mis à part le fait que tu n'utilises pas les mêmes librairies selon l'OS, tu utilises comme moi la fonction GetKeyState. Malgré les bibliothèques différentes, le résultat est le même : pas d'action si l'application n'est pas en premier plan.

    Cordialement.

    Pierre

Discussions similaires

  1. Réponses: 25
    Dernier message: 12/09/2017, 12h44
  2. Comportement différent de cos() selon contexte de l'appel
    Par dreydrey dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 10/01/2011, 17h01
  3. Réponses: 7
    Dernier message: 15/02/2010, 21h52
  4. Comportement différent selon le lanceur
    Par michelcky dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 03/10/2008, 19h03
  5. Comportement différent selon Mode Execution
    Par MarronSuisse dans le forum C
    Réponses: 7
    Dernier message: 14/04/2008, 12h52

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