为什么不按Alt键即可快捷

时间:2018-11-21 18:17:47

标签: delphi

我有一个简单的应用程序2个标签,2个编辑和一个按钮。

enter image description here

如果我按alt + 1或alt + 2,焦点将跳到Edit1或edit2。

如果button1具有焦点,并且我按1(无alt),它将跳转到edit1。

这会带来一些问题。可以禁用它。在borland c ++ 6.0中不是这样。

谢谢

2 个答案:

答案 0 :(得分:4)

此行为是设计使然。当不接受输入的控件具有焦点时,按键将被解释为加速键。

答案 1 :(得分:2)

  

为什么不按Alt键的快捷方式


VCL模拟操作系统行为。对话框navigation topics中将解释其模拟内容:

  

助记符是按钮标签中选择的字母或数字,或者   在静态控件的文本中。系统将输入焦点移至   无论何时用户使用与助记符关联的控件   按对应于助记符的键或按此键   和ALT键组合。

如您所见,按ALT键不是助记符移动焦点的必要条件。为此,尽管如此,已经集中的控件不应对按下的键感兴趣。进一步解释如下:

  

当用户按下字母或数字键时,系统将首先显示   确定当前控件是否具有输入焦点   处理密钥。系统将WM_GETDLGCODE消息发送到   控件,以及该控件是否返回DLGC_WANTALLKEYS或   DLG_WANTMESSAGE值,系统将密钥传递给控件。   否则,它将搜索其助记符与   指定的字母或数字。

这是当您按“ 1”时发生的情况。该按钮不处理密钥,因此VCL会搜索控制者。


  

可以将其禁用


VCL通过在处理TWinControl消息(变异的CN_CHAR)时在WM_CHAR上执行WM_GETDLGCODE来模拟行为。如果控件的响应不包含DLGC_WANTCHARS,则控件在父表单上执行CM_DIALOGCHAR。表单将消息发送到其所有控件,直到/如果其中一个控件想要处理它。

在这里可以覆盖行为,可以测试是否按下了ALT键,如果没有按下,则暂停处理。 CM_DIALOGCHARWM_CHAR使用相同的结构,因此lParam的第29位指定是否按下ALT键。

type
  TForm1 = class(TForm)
    ...
  protected
    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
  ...

procedure TForm1.CMDialogChar(var Message: TCMDialogChar);
begin
  if Boolean(Message.KeyData shr 29 and 1) then
    inherited;
end;