2

请帮助我:如何为操作或菜单项分配向上箭头键盘快捷键,并同时保持其实际用于导航列表控件(例如 ListBox/Virtual Treeview/other)?

谢谢!

4

2 回答 2

2

你评论:

Winamp 播放器怎么样?它具有相应地分配给向上箭头键和向下箭头键的音量增大/音量减小功能.. 好的,如果这在 Delphi 中是不可能的,那么......

但这当然是可能的,但这样做并不是一个好主意,而且违反了 Windows 用户体验交互指南。

但是,如果您打算实施它,这就是方法。在包含操作组件的表单类中覆盖以下方法:

function IsShortCut(var Message: TWMKey): Boolean; override;

在其中,您可以防止 Up 和 Down 键触发它们作为快捷方式的操作:

function TWeirdForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  if (Message.CharCode in [VK_UP, VK_DOWN])
    // insert test whether message needs to go to the focused control instead
    and (...)
  then begin
    // insert calls to code that should be executed instead
    Result := False;
    exit;
  end;
  inherited;
end;

请注意,您还应该测试正确的移位状态,并检查您的代码是否不会破坏用户期望的任何其他窗口行为,例如使用箭头键移动窗口。

于 2010-02-04T18:46:54.140 回答
0

在表单属性集上 KeyPreview := true

然后在表单写入事件的 KeyUp 事件上检查是否按下了 Up 键并使其调用菜单项(在这种情况下,菜单项称为 Action1):

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_UP) and (ActiveControl = ListBox1)then
    Action11.Click;
end;

procedure TForm1.Action11Click(Sender: TObject);
begin
  if ListBox1.ItemIndex >=0  then
    ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
end;

如果即使当前控件不是列表框也需要执行 Action1,请删除语句的and部分IF

于 2010-02-01T13:52:46.610 回答