当按下 Ctrl+"some key" 时,有没有办法阻止烦人的带有控制字符的 OnKeyPress 事件的生成?

Is there a way to stop the annoying generation of OnKeyPress event with control characters when Ctrl+"some key" is pressed?

启动一个新的 VCL 应用程序,在表单上放置一个 TEdit 并将其分配给 OnKeyPress 事件:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 Caption:=Caption+' '+IntToStr(Ord(Key));
end;

当您 运行 应用程序并按下 Ctrl+M 或 Ctrl+H 时,您将在键 OnKeyPress 中收到控制字符 #13(Enter)和 #8(Backspace)事件。有没有办法阻止这种烦人的行为?我的意思是当我按下 Ctrl+M 等快捷键时完全停止接收 OnKeyPress,而不是测试 Ctrl 按下并且在事件中什么都不做。我希望我的应用程序在按下 Enter 键而不是 Ctrl+M 时处理 Enter 键。我希望你明白我在说什么...

OnKeyDown/Up 事件(WM_KEYDOWN/UP 消息)接收单独的击键,报告 虚拟键代码 从键盘的物理 通过键盘驱动扫码

OnKeyPress 事件(WM_CHAR 消息)在处理虚拟键和组合键后接收 翻译字符 (如果它们在全部)。

CTRL-M 翻译 为回车 return (#13) 字符。

CTRL-H 翻译 为退格 (#8) 字符。

这种转换发生在 OS 层,当消息循环在调用 DispatchMessage().

之前将键盘消息传递给 TranslateMessage() 函数时

有关 CTRL 组合的翻译方式,请参阅以下 table:

Control key - examples

另请参阅 Character Messages 以获取有关 WM_KEYDOWN/UP 消息如何转换为 WM_CHAR 消息的更详细说明。

因此,要在 OnKeyPress 事件中区分 CTRL-MENTER,您必须:

  1. 使用 OnKeyDown/Up 事件来跟踪 CTRL (VK_CONTROL) 和 M (VK_M) 虚拟键被按下与 ENTER (VK_RETURN) 虚拟键被按下时的对比。

  2. 使用 GeyKeyState()GetAsyncKeyState() 来检测 CTRL-M 键是否被按下与 ENTER 键被按住。

否则,根本不要使用OnKeyPress。请改用 OnKeyDown/Up,并根据需要进行您自己的击键处理。