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;