Delphi: невозможно захватить Ctrl + C, если пользователь слишком быстро нажал на эту последовательность

Я пытаюсь захватить, когда пользователь нажимает Ctrl + C, чтобы скопировать некоторый текст в буфер обмена. Если пользователь намеренно нажимает и удерживает Ctrl... затем нажимает C, он регистрируется.

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;

Есть ли причина, почему это происходит?

Спасибо!

Ответ 1

Ctrl + C переводится в символьное сообщение. Поэтому вам лучше использовать обработчик OnKeyPress (который запускается в ответ на WM_CHAR):

procedure <anObject>.KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = ^C then
    begin
      // Copy code
    end;
end;


обновление: Я верю, что это происходит: при быстром нажатии пользователь нажимает "Ctrl" , затем нажимает "C" , а затем отпускает "Ctrl" , а затем отпускает "C" . Как вы можете видеть, когда запущен OnKeyUp для "C" , клавиша "Ctrl" уже выпущена. У вас не будет такой проблемы с переведенным сообщением, если ОС зарегистрировала ключ "copy", тогда OnKeyPress будет запущен.

Ответ 2

Обычно OnKeyDown предпочтительнее, чем OnKeyup для такого комбо. Поскольку пользователи обычно знают, чтобы нажать клавишу shift до клавиши char, но не имеют строгого представления о том, какой из них выпустить первым. Кроме того, вы можете изменить ключ var на 0, чтобы не допустить, чтобы клавиши были дополнительно интерпретированы другими уровнями ключевых событий, чтобы переопределить поведение по умолчанию.

Ответ 3

Это не последовательность, это комбинация клавиш. Это означает, что Ctrl и C необходимо нажать одновременно. Если пользователь этого не делает, он не может быть записан как Ctrl + C.

Но я угадываю. Я не могу сказать, что делает пользователь. Возможно, есть проблема с клавиатурой или драйвером.


Чтобы узнать, что сказал Роб (случайно приняв другие клавиши переключения), измените свой код на:

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

Ответ 4

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;