我有同样的问题,不想重新编程ContextMenuStrip
已经提供给我的访问功能。
最大的问题是,当我扩展或更改ContextMenuStrip
项目时,我必须更改或更改我自己的键事件。我的目标是绕过这个并将全局快捷键重定向ContextMenuStrip
到执行代码点击。
首先,我构建了一种方法,可以递归地获取所有ToolStripMenuItems
列表ContextMenuStrip
:
private List<ToolStripMenuItem> getContextMenuItems(ToolStripItemCollection items)
{
List<ToolStripMenuItem> result = new List<ToolStripMenuItem>();
foreach (ToolStripMenuItem item in items)
{
result.Add(item);
if (item.HasDropDownItems)
{
result.AddRange(this.getContextMenuItems(item.DropDownItems));
}
}
return result;
}
然后我设置 KeyUp 事件以在包装控件上捕获我的键。this.cmsCellRightClick
是我的ContextMenuStrip
:
private void xxxxx_KeyUp(object sender, KeyEventArgs e)
{
Keys pressed = e.KeyCode;
if (e.Control) pressed = pressed | Keys.Control;
if (e.Shift) pressed = pressed | Keys.Shift;
if (e.Alt) pressed = pressed | Keys.Alt;
ToolStripMenuItem actionItem = this.getContextMenuItems(this.cmsCellRightClick.Items)
.Where(x => x.ShortcutKeys == pressed).FirstOrDefault();
if (actionItem != null)
{
actionItem.PerformClick();
}
e.SuppressKeyPress = true;
}
结果是它会捕获我的击键并将它们发送给我ContextMenuStrip
并执行点击,即使ContextMenuStrip
是隐藏/未打开。