Delphi XE2:如何防止Alt键窃取焦点?

use*_*348 3 delphi alt-key delphi-xe2

例如,当光标位于“编辑”字段中时,按下并释放Alt键(而不按其他任何键)会导致“编辑”字段失去焦点。任何其他集中控制也会发生这种情况。对于任何集中控制,如何在Delphi程序中防止这种情况发生?

J..*_*... 5

一个更好的方法来减少意外的后果是要非常精确-我建议:

在您的表单中,重写WndProc:

TForm1 = class(TForm)
  Edit1: TEdit;
private
   FSuppress : boolean;
protected
   procedure WndProc(var Message : TMessage); override;
end;
Run Code Online (Sandbox Code Playgroud)

像这样实现:

procedure TForm1.WndProc(var Message : TMessage);
begin
  if (Message.Msg = WM_SYSCOMMAND) and
     (Message.WParam = SC_KEYMENU) and
     FSuppress then Exit;

  inherited WndProc(Message);
end;
Run Code Online (Sandbox Code Playgroud)

这是系统命令和特定WParam的Windows消息,指示该消息用于检索由击键触发的菜单。设置FSuppress您希望保持关注的任何控件:

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  FSuppress := true;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FSuppress := false;
end;
Run Code Online (Sandbox Code Playgroud)

这不会禁用ALT键,但是会特别禁用在Edit1焦点对准时菜单的激活。至关重要的是,ALT + F4退出程序或ALT+TAB切换窗口之类的快捷方式仍然可以使用。

但是,我同意大多数意见,因为这可能不是针对用户群LCD的最佳解决方案。您实际上是在削弱该计划,让有能力的用户顺应那些无能的用户的失败。也许使它成为Windows粘滞键之类的选项,或为各种残障人士提供的辅助功能选项。