启动一个新的 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 组合的翻译方式:
另请参阅Character Messages更详细的解释WM_KEYDOWN/UP
消息被翻译成WM_CHAR
消息。
因此,要区分 OnKeyPress
中的 CTRL-M 和 ENTER事件,您必须:
使用
OnKeyDown/Up
用于跟踪何时按下 CTRL (VK_CONTROL
) 和 M (VK_M
) 虚拟键以及何时按下 ENTER 的事件(VK_RETURN
) 虚拟键被按下。使用
GeyKeyState()
或GetAsyncKeyState()
检测是否按住 CTRL-M 键与是否按住 ENTER 键。
否则,请勿使用OnKeyPress
根本不。使用OnKeyDown/Up
相反,并根据需要进行自己的击键处理。
关于delphi - 有没有办法在按下 Ctrl +"some key"时停止使用控制字符生成烦人的 OnKeyPress 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089299/