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

时间:2013-05-30 05:00:03

标签: delphi delphi-xe2 alt-key

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

2 个答案:

答案 0 :(得分:4)

以更少的意外后果做到这一点的更好方法是非常准确 - 我建议:

在表单中,覆盖WndProc:

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

并按照以下方式实施:

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;

这是系统命令的Windows消息和特定的WParam,表示它用于检索由击键触发的菜单。在您希望保持焦点的任何控件上设置FSuppress

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

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FSuppress := false;
end;

这不会禁用ALT键,但会在Edit1有焦点时禁用,特别是激活菜单。重要的是,像ALT + F4退出程序或ALT+TAB切换窗口的快捷方式仍然有效。

我同意大多数评论,但这可能不是您用户群LCD的最佳解决方案。对于有能力的用户而言,你实际上正在削弱计划,以迎合无能的人的失败。或许可以为各种残障人士提供Windows粘贴键或辅助功能选项。

答案 1 :(得分:0)

procedure SendKey_ALT;
begin
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
    keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
end;

在您的 FormCreate() 方法中调用上述过程。 这将解决问题。