我想在用户按 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;
为什么会发生这种情况?
谢谢!
答案 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))))