当按下 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:
另请参阅 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
,并根据需要进行您自己的击键处理。
启动一个新的 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:
另请参阅 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
,并根据需要进行您自己的击键处理。