我通过创建一个看起来类似于标准工具提示(带有标签的小框)的 WPF 控件解决了这个问题。然后,我对表单上的 ProcessCmdKey 和 OnKeyUp 进行了覆盖,以收听 CTRL 键的按下和按下。
当用户按住 CTRL 键时,我会遍历所有具有快捷方式的控件,并在该控件之上创建一个 WPF 控件。对于每个 WPF 控件,我设置了相应的快捷方式文本。释放 CTRL 键后,我删除了 OnKeyUp 中的所有 WPF 控件。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{ if ((msg.Msg == WM_KEYDOWN) && ModifierKeys == Keys.Control && !_isKeyDown)
{
_isKeyDown = true;
ShowShortCutToolTips();
this.Focus();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
if(e.KeyValue == 17 || e.Control) // 17 = Control Key
{
_isKeyDown = false;
HideShortCutToolTips();
}
}