请帮助我:如何为操作或菜单项分配向上箭头键盘快捷键,并同时保持其实际用于导航列表控件(例如 ListBox/Virtual Treeview/other)?
谢谢!
你评论:
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;
请注意,您还应该测试正确的移位状态,并检查您的代码是否不会破坏用户期望的任何其他窗口行为,例如使用箭头键移动窗口。
在表单属性集上 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