Delphi:如果用户按下序列太快,则无法捕获Ctrl + C.

时间:2011-08-12 21:08:41

标签: delphi

我想在用户按 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;

为什么会发生这种情况?

谢谢!

4 个答案:

答案 0 :(得分:21)

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'。正如您所看到的,当'C'的OnKeyUp被触发时,'Ctrl'键已经被释放。翻译的消息不会出现这种问题,如果操作系统注册了'copy'键,那么OnKeyPress将被解雇。

答案 1 :(得分:4)

通常,对于这样的组合,OnKeyDown比OnKeyup更优选。因为用户通常知道在char键之前按下那些shift键但是没有严格意义上先释放哪一个。此外,您可以将var键更改为0,以防止其他级别的键事件进一步解释键以覆盖某些默认行为。

答案 2 :(得分:2)

它不是一个序列,它是一个关键组合。这意味着必须同时按 才能按住Ctrl和C.如果用户不这样做,则无法将其捕获为Ctrl + C.

但我猜。我不知道用户在做什么。也许键盘或驱动程序也存在问题。


要说明Rob说的话(意外地接受其他班次键),请将您的代码更改为:

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

答案 3 :(得分:0)

foreach (string dir in Directory.GetDirectories(dirPath).Where(filePath => list.Any(path => filePath.StartsWith(path, StringComparison.OrdinalIgnoreCase))))