更新: 我机器上的另一个进程正在干扰快捷方式检测。
在 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;
以上两个过程仅在按下 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;
当我按下 CTRL + C 时,计算机发出蜂鸣声。
程序中的其他部分正在处理应用程序中的按键操作。
回到上面的情况,如果 CTRL 按下,这将触发,无论其他修饰键的状态如何。因此,您还将响应 CTRL + SHIFT C、CTRL + ALT C 和 CTRL + SHIFT + ALT C. 我怀疑你想这样做。所以你可以将条件写为:
if (Shift*[ssCtrl,ssShift,ssAlt]=[ssCtrl]) and (key = Ord('C')) then
<小时/>
请注意,您的代码中存在许多错误:
- 调用
Clipboard.Free
将销毁不属于您的共享对象。你绝对不能这样做。删除这些调用。 - 您的
if
语句的逻辑是错误的。测试Key = Ord('c')
始终为 false。当按下该键时,无论修饰键的状态如何,您都必须测试大写序数Key = Ord('C')
。 - 您的条件采用以下形式:
if a and b or c
。运算符优先级意味着它被评估为if (a and b) or c
。这不是你想要的。
所有这些都是没有意义的,因为当按下 C 键时,无论修饰符状态如何,您的条件都会评估 True
。结论仍然相同:其他东西正在处理 CTRL + C 并阻止该按键事件到达您的代码。
关于delphi - delphi XE7中KeyDown需要移位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680421/