delphi - delphi XE7中KeyDown需要移位寄存器

标签 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)时,它不会触发。

我很困惑!

最佳答案

我创建了一个空的 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/

相关文章:

Delphi 非阻塞 ShowModal

delphi - "As"约束泛型类型的运算符

file - 如何使用 Synapse 发送文件和其他 POST 数据

delphi - 执行查询时显示 ProgressBar

multithreading - 为什么显示弹出菜单时不调用Application.OnMessage?

multithreading - Delphi指针内存和释放

delphi - ExptIntf 和 ToolIntf 以及 TIExpert 有何用途?

PostgreSQL VCL 控件

delphi - 如何使用 TDBChart VCL Teechart 组件使用单个数据集制作堆积条形图?

C++ 构建器 TstringGrid 从特定单元格获取字符串