11
votes

Delphi: Impossible de capturer Ctrl + C si l'utilisateur a appuyé sur la séquence trop rapidement.

J'essaie de capturer lorsqu'un utilisateur appuie sur Ctrl kbd> + C kbd> afin de copier du texte dans le presse-papiers. Si l'utilisateur appuie délibérément et contient Ctrl kbd> ... puis appuie sur C kbd> il enregistrera.

procedure <anObject>.KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin    
  if (ssCtrl in Shift) and (upcase(Char(key)) = 'C')
    then
      begin
        //Copy code    
      end;
end;


4 commentaires

Avez-vous envisagé de définir simplement le raccourci de la propriété de l'élément de menu ou de l'action associée à cette commande? Ensuite, vous n'avez pas à vérifier chaque raccourci possible comme cela. Vous n'aurez pas non plus à vous soucier d'accepter accidentellement Ctrl + Shift + Alt + C lorsque vous ne vouliez que CTRL + C.


Je voudrais mais j'ai oublié de mentionner qu'il s'agit d'un composant de DevExpress. Cela ne me permet pas les mêmes options que des composants réguliers. Je garderai cela à l'esprit pour d'autres composants. Merci!


Si l'étrange chose à Delphi est, si l'ALT est pressé, puis contrôler, le contrôle de l'utilisateur ne tire pas, pas encore sûr pourquoi. Peut-être que Shift State peut être utilisé pour obtenir avec précision l'état de la clé de contrôle = D Nope toujours ne fonctionne toujours pas, c'est bizarre. Appuyez d'abord sur ALT, puis de déclencher des gestionnaires pour le contrôle ... Je suppose que l'alt est peut-être causant une sorte d'activation de VCL pour aller au contrôle suivant ou quelque chose d'étrange ou d'activation du menu de forme ou de quelque chose.


ou (msg.message = wm_sysykedown) aide.


4 Réponses :


3
votes

Ce n'est pas une séquence, c'est une combinaison clé. Cela signifie que CTRL et C doivent être pressés en même temps em> strong>. Si l'utilisateur ne le fait pas, il ne peut pas être capturé comme CTRL + C.

mais je devine. Je ne peux pas dire ce que l'utilisateur fait. Peut-être qu'il y a aussi un problème avec le clavier ou le pilote pour cela. P>


Pour rendre compte de ce que Rob a dit (accepter accidentellement d'autres clés de décharge), modifiez votre code sur: P>

if (Shift = [ssCtrl]) and (Upcase(Char(Key)) = 'C') then


1 commentaires

Je vais certainement faire changer = ... au lieu de la façon dont je l'ai fait. Merci pour le pointeur!



21
votes

Ctrl + C est traduit en un message de caractère. Donc, vous feriez mieux d'utiliser un OnKeyPress Handler (qui est tiré en réponse à un wm_char ): xxx


: Je crois ce qui se passe est la suivante: lorsque vous appuyez rapidement sur "Ctrl", appuyez sur "CTRL", puis sur "C", puis relâche "Ctrl", relâchant enfin "C". Comme vous pouvez le constater lorsque la touche ONKEYUP pour 'C' est tirée, la touche "Ctrl" est déjà publiée. Vous n'aurez pas ce genre de problème avec le message traduit, si le système d'exploitation a enregistré la touche "Copie", alors onKeyPress sera tiré.


0 commentaires

4
votes

généralement, onKeyDown est plus préférable qu'on fonctionne pour un tel combo. Parce que les utilisateurs savent généralement appuyer sur ces touches de décalage avant la touche de charme, mais n'ont pas de sens strict dont une à libérer en premier. En outre, vous pouvez modifier la clé VaR sur 0 pour empêcher les clés d'être interprétées davantage par d'autres niveaux d'événements clés pour remplacer certains comportements par défaut.


1 commentaires

Je n'avais pas envisagé cela, mais vous avez raison, il semble que ce soit comme un meilleur endroit pour mettre ce code



0
votes
Procedure TForm1.StringGrid1KeyPress (Sender: TObject; var Key: Char);

 Var
  Sel: TGridRect; // Selecting the Scenes
  St: String; // Stroke
  R, c: word; // Row-Stroke, Col-Column

  Begin
 If Key = ^ C then
    Begin
     St: = ''; / / A full explanation of the structure
  Sel: = StringGrid1.Selection; // Wait a while for a loose ticket
  For r: = Sel.Top to Sel.Bottom do // query the lines of the first row
  Begin
    For c: = Sel.Left to Sel.Right do // query the number of lines in the foreground
    // Scribble in the Stroke of a Distributor
    If c = Sel.Right then St: = St + StringGrid1.Cells [c, r] else St: = St + StringGrid1.Cells [c, r] + # 9;
    St: = St + # 13 # 10; // the pattern of the stencil
  End;
  ClipBoard.AsText: = St; // Displays the alarm
    End;

End;

0 commentaires