delphi中的KeyDown XE7需要转移到寄存器

2sl*_*oth 5 delphi vcl

更新: 我的机器上的另一个进程干扰了快捷方式检测.

在VCL TStringgrid中我想使用"Ctrl + C"和/或"Ctrl + c"复制内容

代码段:

procedure TEditWaterFrame.sgSSPKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
    if (ssCtrl in Shift) AND ((Key = Ord('c')) OR (key = Ord('C'))) then  // this just won't work without me holding ssShift as well, I'm clueless...!
    begin
        ShowMessage('Ctrl+C pressed as keys');
        try
            Clipboard.AsText    := writeSSPToCSVString(#9);
        finally
            Clipboard.Free;
        end;
    end;

end;

// trying with keypress
procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char);
begin
    if (Key = ^c) then  // this just won't work without me holding ssShift as well, I'm clueless...!
    begin
        ShowMessage('Ctrl+C pressed as char');
        try
            Clipboard.AsText    := writeSSPToCSVString(#9);
        finally
            Clipboard.Free;
        end;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

上面的两个步骤仅在按下ssCtrl + ssShift + c/C时运行.未按下ssShift时不会触发(即Ctrl + c或Ctrl + C).

我很神秘!

Dav*_*nan 5

我创建了一个空的 VCL 表单应用程序,向主表单添加了一个字符串网格,并为其OnKeyDown事件实现了一个事件处理程序:

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssCtrl in Shift) and (key = Ord('C')) then
    Beep;
end;
Run Code Online (Sandbox Code Playgroud)

CTRL当我按+ C时,计算机发出蜂鸣声。

程序中的其他部分正在处理应用程序中的按键操作。

回到上面的条件,如果CTRL按下,这将触发,无论其他修饰键的状态如何。所以你也会回应CTRL+ SHIFTC、CTRL+ ALTC 和CTRL+ SHIFT+ ALTC。我怀疑你想这样做。所以你可以将条件写为:

if (Shift*[ssCtrl,ssShift,ssAlt]=[ssCtrl]) and (key = Ord('C')) then
Run Code Online (Sandbox Code Playgroud)

请注意,您的代码中存在许多错误:

  • 调用Clipboard.Free将破坏您不拥有的共享对象。你绝对不能这样做。删除这些调用。
  • 你这句话的逻辑if是错误的。测试Key = Ord('c')总是错误的。当按下该键时,无论修饰键的状态如何,您都必须测试大写序数Key = Ord('C')
  • 你的情况是这样的if a and b or c。运算符优先级意味着它被评估为if (a and b) or c。那不是你的本意。

所有这些都是没有意义的,因为True无论修改器状态如何,按下 C 键时都会评估您的条件。结论仍然相同:其他东西正在处理CTRL+ C 并阻止该按键事件到达您的代码。