C# 如何响应键盘和弦并用特殊的字母键替换输入的字母键?
我想在WinForms应用程序的文本框中使用C#,用特殊字符替换某些键盘和弦。例如,如果用户输入“Ctrl+A”,我想在文本框中插入字符“á”;如果用户输入“Ctrl+Shift+A”,我想在文本框中插入字符“Á”,等等 根据我的发现,我从以下几点开始:C# 如何响应键盘和弦并用特殊的字母键替换输入的字母键?,c#,winforms,keydown,keycode,modifier-key,C#,Winforms,Keydown,Keycode,Modifier Key,我想在WinForms应用程序的文本框中使用C#,用特殊字符替换某些键盘和弦。例如,如果用户输入“Ctrl+A”,我想在文本框中插入字符“á”;如果用户输入“Ctrl+Shift+A”,我想在文本框中插入字符“Á”,等等 根据我的发现,我从以下几点开始: private void textBox_KeyDown(object sender, KeyEventArgs keArgs) { bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;
private void textBox_KeyDown(object sender, KeyEventArgs keArgs)
{
bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;
String replacement = null;
if (Control.ModifierKeys == Keys.None) return; // doesn't work
if (useHTMLCodes)
{
if (Control.ModifierKeys == Keys.Control && keArgs.KeyCode == Keys.A)
{
replacement = "á";
}
else if (Control.ModifierKeys == Keys.Control && Control.ModifierKeys == Keys.Shift && keArgs.KeyCode == Keys.A)
{
replacement = "Á";
}
}
else // just replace with the raw char, not the fancy-pants HTML code
{
if (Control.ModifierKeys == Keys.Control && keArgs.KeyCode == Keys.A)
{
replacement = "á";
}
else if (Control.ModifierKeys == Keys.Control && Control.ModifierKeys == Keys.Shift && keArgs.KeyCode == Keys.A)
{
replacement = "Á";
}
}
MessageBox.Show(replacementChar);
}
…但在极度需要修补的情况下,它不值得一只无角袜子。messagebox不显示任何内容(空字符);我试图通过在未找到任何密钥时返回来抢占单个密钥,但这也不起作用
那么,实际上,我如何响应定义的和弦,并在截取输入的内容后在文本框中插入一个特殊的键呢
使现代化
Idle_Mind的回答很好,但仍然有两个键不起作用——由Ctrl+Shift+N生成的“ñ”和“,”,因为似乎没有与“!”对应的键成员可以尝试移动
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (this.ActiveControl != null && this.ActiveControl is TextBox)
{
string replacement = "";
TextBox tb = (TextBox)this.ActiveControl;
bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;
// A
if (keyData == (Keys.Control | Keys.A))
{
replacement = useHTMLCodes ? "á" : "á";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.A))
{
replacement = useHTMLCodes ? "Á" : "Á";
}
// E
if (keyData == (Keys.Control | Keys.E))
{
replacement = useHTMLCodes ? "é" : "é";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.E))
{
replacement = useHTMLCodes ? "É" : "É";
}
// I
if (keyData == (Keys.Control | Keys.I))
{
replacement = useHTMLCodes ? "í" : "í";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.I))
{
replacement = useHTMLCodes ? "Í" : "Í";
}
// O
if (keyData == (Keys.Control | Keys.O))
{
replacement = useHTMLCodes ? "ó" : "ó";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.O))
{
replacement = useHTMLCodes ? "Ó" : "Ó";
}
// U
if (keyData == (Keys.Control | Keys.U))
{
replacement = useHTMLCodes ? "ú" : "ú";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.U))
{
replacement = useHTMLCodes ? "Ú" : "Ú";
}
// U Umlauts
if (keyData == (Keys.Control | Keys.Alt | Keys.U))
{
replacement = useHTMLCodes ? "ü" : "ü";
}
else if (keyData == (Keys.Control | Keys.Alt | Keys.Shift | Keys.U))
{
replacement = useHTMLCodes ? "Ü" : "Ü";
}
// N
if (keyData == (Keys.Control | Keys.N))
{
replacement = useHTMLCodes ? "ñ" : "ñ";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.N))
{
replacement = useHTMLCodes ? "Ñ" : "Ñ"; // not working
}
// ?
if (keyData == (Keys.Control | Keys.OemQuestion))
{
replacement = useHTMLCodes ? "¿" : "¿";
}
// !
//if (keyData == (Keys.Control | Keys.)) // what is the exclamation point?
//{
// replacement = useHTMLCodes ? "¡" : "¡";
//}
if (replacement != "")
{
tb.SelectedText = replacement;
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
注释和被注释掉的部分清楚地说明了什么不起作用。这里有一种方法可以为表单上的所有文本框实现这一点:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (this.ActiveControl != null && this.ActiveControl is TextBox)
{
string replacement = "";
TextBox tb = (TextBox)this.ActiveControl;
bool useHTMLCodes = checkBoxUseHTMLCodes.Checked;
if (keyData == (Keys.Control | Keys.A))
{
replacement = useHTMLCodes ? "á" : "á";
}
else if (keyData == (Keys.Control | Keys.Shift | Keys.A))
{
replacement = useHTMLCodes ? "Á" : "Á";
}
if (replacement != "")
{
tb.SelectedText = replacement;
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
亲爱的香农,在问过你之后,你现在应该知道我们想要的不是一篇漂亮的散文。这里有很多文本,但归结起来是“这不起作用,为我调试这个”,对此我回答“不”。例如,当你按下想要截取的键时,
KeyEventArgs
的各种属性的值是什么?Idle\u Mind算出了,Caster。你可以很容易地算出其余的。添加一个Debug.WriteLine(keyData),您将看到用于按键的掩码。你真的需要花更多的精力调试你自己的代码。谁会认为感叹号/标记/字符是“D1”…傻瓜。在