C# 捕捉Ctrl+;文本框中的C
尽管我在C#()上工作了多年,但我的大脑还是有一个失灵的时刻,我一辈子都不知道如何捕捉到用户在文本框中键入Ctrl+C 我的应用程序基本上是一个终端应用程序,我希望Ctrl+C将C# 捕捉Ctrl+;文本框中的C,c#,winforms,textbox,C#,Winforms,Textbox,尽管我在C#()上工作了多年,但我的大脑还是有一个失灵的时刻,我一辈子都不知道如何捕捉到用户在文本框中键入Ctrl+C 我的应用程序基本上是一个终端应用程序,我希望Ctrl+C将(byte)3发送到串行端口,而不是作为复制到剪贴板的快捷方式 我已在文本框中将快捷方式启用属性设置为false。然而,当用户点击Ctrl+C时,按键事件不会触发 如果我捕获keydown,则当用户按下Ctrl键(即,在他们按下C键之前)时会触发事件 我可能错过了一些非常简单的东西。继续使用KeyDown事件,但在该事件
(byte)3
发送到串行端口,而不是作为复制到剪贴板的快捷方式
我已在文本框中将快捷方式启用
属性设置为false。然而,当用户点击Ctrl+C时,按键事件不会触发
如果我捕获keydown,则当用户按下Ctrl键(即,在他们按下C键之前)时会触发事件
我可能错过了一些非常简单的东西。继续使用KeyDown事件,但在该事件中,同时检查Ctrl和C,如下所示:
if (e.Control && e.KeyCode == Keys.C) {
//...
e.SuppressKeyPress = true;
}
另外,为了防止底层文本框处理击键,请将SuppressKeyPress属性设置为true,如图所示。尝试以下操作:捕获向上箭头和向下箭头事件。当您检测到CTRL的向下箭头时,设置一个标志;检测到向上箭头时,重置标志。如果在设置标志时检测到C键,则使用Ctrl+C
编辑。哎哟杰伊的答案肯定更好。:-) 关键事件按以下顺序发生:
if(e.KeyData==(Keys.Control | Keys.C))
D'oh!我刚想出来。在三个可能的事件中,我没有尝试过的就是我需要的!KeyUp事件是一个重要事件:
private void txtConsole_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.C | Keys.Control))
{
_consolePort.Write(new byte[] { 3 }, 0, 1);
e.Handled = true;
}
}
我在通过KeyDown
捕捉文本框上的Ctrl+C时遇到问题。当同时按下Control
和C
时,我才得到Control
键。解决方案是使用PreviewKeyDown
:
private void OnLoad()
{
textBox.PreviewKeyDown += OnPreviewKeyDown;
textBox.KeyDown += OnKeyDown;
}
private void OnPreviewKeyDown( object sender, PreviewKeyDownEventArgs e)
{
if (e.Control)
{
e.IsInputKey = true;
}
}
private void OnKeyDown( object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.C) {
textBox.Copy();
}
}
我不知道这是因为更新版本中的一些更改,还是因为我试图在ListBox上使用它,但在KeyEventArgs e
中没有我从KeyDown获得的e.Control
我必须解决这个问题,我想出了这个(这不是最漂亮的,但效果很好):
private List KeyBuff=new List();
私有无效列表框\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(!KeyBuff.Exists(k=>k==e.Key))
KeyBuff.Add(e.Key);
if(KeyBuff.Exists(k=>k==Key.LeftCtrl | | k==Key.RightCtrl)&&
KeyBuff.Exists(k=>k==Key.C))
{
//期望检测
剪贴板.SetText(SelectedText);
}
}
私有无效列表框\u KeyUp(对象发送方,KeyEventArgs e)
{
KeyBuff.Clear();
}
对我来说,它不适用于KeyDown事件,所以我尝试了PreviewKeyDown,但效果不错
private void txt_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.Control == true && e.KeyCode == Keys.C)
{
Clipboard.SetText(txt.SelectedText);
}
}
如果您想在按键事件
中捕捉这些按键组合,请查看以下表格:
在非打印字符
部分,您可以看到每个组合的Dec编号。
例如,Ctrl+C的Dec编号为3
。因此,您可以在按键事件中捕捉它,如下所示:
private void btnTarget_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != 3) // if it is not Ctrl + C
{
// do something
}
}
你们都比我强。KeyDown对我不起作用,因为我用断点捕捉事件。它在KeyUp上运行得很好,所以我决定参加这个活动。因为这是第一个工作响应而被接受。非常感谢我最终还是找到了答案——看看我自己的答案。我知道,这已经有一段时间了,但对于那些将来会发现这一点的人来说:Shift-Insert仍在处理中,因此需要添加(e.Shift&&e.KeyCode==Keys.Insert)验证。用户还可以右键单击该字段并选择粘贴。。。所以不是100%的证据。不是真的,KeyUp事件捕获是正确的解决方案。
private void btnTarget_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar != 3) // if it is not Ctrl + C
{
// do something
}
}