3

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

4

2 回答 2

5

减少意外后果的更好方法是对此非常精确 - 我建议:

在您的表单中,覆盖 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 粘滞键或各种残疾人的辅助功能选项。

于 2013-05-30T12:27:54.523 回答
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() 方法中调用上述过程。这将解决问题。

于 2021-05-30T11:44:14.997 回答