我想创建一个快捷方式,当在我的应用程序中按下字母“Ç”时,该快捷方式将执行任务。但没有定义“Ç”键。我怎样才能做到这一点? 示例:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.Alt | Keys.D1:
// Number 1
return true;
case Keys.Alt | Keys.D2:
// Number 2
return true;
case Keys.Ç:
// There is no defined "Ç" (c-cedilla) key.
return true;
default:
return base.ProcessCmdKey(ref msg, keyData);
}
return true;
}
据我从Hans Passant的评论中了解到,按键分配根据键盘组合而变化。所以我想出了这个解决方案。首先指定键盘,然后将快捷键分配给适当的 OEM 键。我知道,这是非常诡辩的,软件逻辑不喜欢诡辩的事情。但总比没有解决方案好。我认为最好的方法是为标准字母指定快捷方式,例如
C
。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.Alt | Keys.D1:
// Number 2
case Keys.Alt | Keys.D2:
// Number 1
return true;
// For Turkish Q
default:
{
// For Turkish Q
if (KeyboardLayout.GetLayoutCode() == "0000041F" && keyData is Keys.Oem5)
{
// C-cedilla key.
return true;
}
// For Spanish
if (KeyboardLayout.GetLayoutCode() == "0000040A" && keyData is Keys.Oem2)
{
// C-cedilla key.
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
}
public class KeyboardLayout
{
private const int KL_NAMELENGTH = 9;
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID);
//each keyboard layout is defined in Windows as a hex code
public static string GetLayoutCode()
{
var name = new StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
return name.ToString();
}
}
请参阅有关键盘检测的主题。