更新: 我机器上的另一个进程干扰了快捷方式检测。
在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),它不会触发。
我很神秘!
答案 0 :(得分:4)
我创建了一个空的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并停止该密钥事件到达您的代码。
答案 1 :(得分:0)
按下 CTRL-C 时,以下对我来说没问题:
select '<YYYY//MM//DD portion of decoded_path>', count(*) from table group by '<YYYY//MM//DD portion of decoded_path>' order by '<YYYY//MM//DD portion of decoded_path>';
如果您只想 CTRL-C ,而不是 CTRL + SHIFT + C , CTRL + ALT + C 等,您必须使用procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #3) then // ^c also works
begin
ShowMessage('Ctrl+C pressed');
...
end;
end;
来确保 SHIFT 和 ALT 键也不会被按下:
Get(Async)KeyState()
procedure TEditWaterFrame.sgSSPKeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #3) then // ^c also works
begin
if (GetKeyState(VK_SHIFT) = 0) and (GetKeyState(VK_MENU) == 0) then
begin
ShowMessage('Ctrl+C pressed');
...
end;
end;
end;