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

时间:2017-06-21 15:31:20

标签: 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;

如果按下ssCtrl + ssShift + c / C,则上述两个步骤才会运行。 未按下ssShift时(即Ctrl + c或Ctrl + C),它不会触发。

我很神秘!

2 个答案:

答案 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;