delphi - 有没有办法在按下 Ctrl +"some key"时停止使用控制字符生成烦人的 OnKeyPress 事件?

标签 delphi keyboard-events delphi-2009

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

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

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

最佳答案

OnKeyDown/Up事件( WM_KEYDOWN/UP 消息)接收单独的击键,报告由键盘驱动程序从键盘的物理扫描代码转换而来的虚拟键代码

OnKeyPress处理虚拟键和组合键后(如果它们完全转换为字符),事件(WM_CHAR 消息)接收翻译字符

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

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

当消息循环将键盘消息传递到TranslateMessage()时,这种转换发生在操作系统层。调用 DispatchMessage() 之前的函数.

请参阅下表了解各种 CTRL 组合的翻译方式:

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相反,并根据需要进行自己的击键处理。

关于delphi - 有没有办法在按下 Ctrl +"some key"时停止使用控制字符生成烦人的 OnKeyPress 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089299/

相关文章:

java - 设置按钮事件后可聚焦

delphi - 将使用 Png 图像的项目转换为 D2009

delphi - 为什么有些数组可以发布,而另一些则不能?

Delphi 2007 VI/VIM 按键映射

datetime - 对于 TDateTime 为负值的操作,Delphi 显示奇怪的结果

delphi - SendInput 与 keybd_event

javascript - 如何改进 JavaScript 的结构以更好地利用 OOP

delphi - 在 RAD Studio 2009 中更改编辑器字体

delphi - GetThreadLocale 返回的值与 GetUserDefaultLCID 不同吗?

delphi - 如何找出从 Delphi 应用程序发送 MadExcept 错误报告的结果