更新: 我的机器上的另一个进程干扰了快捷方式检测.
在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).
我很神秘!
我创建了一个空的 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 并阻止该按键事件到达您的代码。