C# Ctrl+;C不';无法在Windows窗体应用程序中正常工作

C# Ctrl+;C不';无法在Windows窗体应用程序中正常工作,c#,winforms,datagridview,copy-paste,C#,Winforms,Datagridview,Copy Paste,我的DataGridView上有一个将数据复制到剪贴板的事件,但我的事件没有检测到Ctrl+C正确按下(我必须按Ctrl+C大约15次,才能使此事件检测到Ctrl+C按下) 代码如下: private void DataGridView_KeyUp(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Control | Keys.C)) { DataObject d

我的DataGridView上有一个将数据复制到剪贴板的事件,但我的事件没有检测到Ctrl+C正确按下(我必须按Ctrl+C大约15次,才能使此事件检测到Ctrl+C按下)

代码如下:

    private void DataGridView_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyData == (Keys.Control | Keys.C))
        {
            DataObject d = DataGridView.GetClipboardContent();
            Clipboard.SetDataObject(d);
            e.Handled = true;
        }
    }
为什么会这样

按下Ctrl+C时发生的情况的屏幕截图


如果您将断点放在
If
案例中,那么您将用错误的信息大量命中该案例。除非同时按Ctrl和C

我使用这段代码捕获Ctrl+C(检查):

因为它是框架2.0:

private void DataGridView_KeyUp(object sender, KeyEventArgs e)
{
 if (e.Key == Key.C && (Control.ModifierKeys & Keys.Shift) == Keys.Shift)
 {
   DataObject d = DataGridView.GetClipboardContent();
   Clipboard.SetDataObject(d);
   e.Handled = true;
  }
}

您的屏幕截图显示您检测到正在释放Ctrl键。当然不是你想要的

不能使用KeyUp事件,DataGridView已经截取Ctrl+C供自己使用。并执行逻辑操作,将选定的单元格、列或行复制到剪贴板。确保它没有做你需要它做的事情

如果要覆盖它,则需要保持DGV的领先地位。这要求您从DataGridView派生自己的类并重写ProcessCmdKey()方法。将类添加到项目中,并使其如下所示:

using System;
using System.Windows.Forms;

class MyDataGridView : DataGridView {
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == (Keys.Control | Keys.C)) {
            // Do stuff
            //..
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

当你说它没有检测到它时,你是基于这样一个事实,即你在某处有一个断点,并且你正在尝试调试它吗?或者,您是在没有调试器的情况下运行它,而它没有检测到它吗?我在没有调试器的情况下运行,它可以工作十次按。您应该使用e.修饰符来检查是否按了Ctrl键。@Silvermind否,只有键\u UpNo这样的属性
e.key
在“KeyEventArgs e”上可以找到它。。编辑了我的问题以反映整个方法。我找不到对windows.input的引用。在框架2.0中编写。顺便说一句,好的。。您可以检查此链接:@JonasW我正在使用此
(e.KeyCode==Keys.C&&(Control.ModifierKeys&Keys.Control)==Keys.Control)
,并且它不是每次都起作用,但如果我的DGV有自己的方法,为什么不将选定的单元格复制到剪贴板?或者我如何允许我的dgw执行此操作?@Greag.Deay我已经尝试过,看起来默认情况下启用了
单元格复制功能
,为什么您看不到它工作?@KingKing
ClipboardCopyMode=EnableWithoutHeaderText
,并且它不会通过ctrl+c复制到剪贴板:(@Greag.Deay不确定为什么它对您不起作用,但对我起作用,尽管默认值是
EnableWithAutoHeaderText
using System;
using System.Windows.Forms;

class MyDataGridView : DataGridView {
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == (Keys.Control | Keys.C)) {
            // Do stuff
            //..
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}