gpt4 book ai didi

delphi - 当按下Ctrl +“某些键”时,是否可以通过控制字符停止烦人的OnKeyPress事件的生成?

转载 作者:行者123 更新时间:2023-12-03 18:26:35 26 4
gpt4 key购买 nike

启动一个新的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(回车)和#8(退格)。有没有办法停止这种烦人的行为?我的意思是当我按下Ctrl + M之类的快捷键时完全停止接收 OnKeyPress,而不是测试Ctrl down并在事件内部不执行任何操作。我希望我的应用程序在按Enter键而不是Ctrl + M时处理Enter键。我希望你明白我在说什么...

最佳答案

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

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

CTRL-M转换为回车符(#13)。

CTRL-H转换为退格(#8)字符。

当消息循环在调用TranslateMessage()之前将键盘消息传递给DispatchMessage()函数时,此转换发生在OS层。

有关如何转换各种CTRL组合的信息,请参见下表:

Control key - examples

另请参阅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 +“某些键”时,是否可以通过控制字符停止烦人的OnKeyPress事件的生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com