【问题标题】:c# how to capture Ctrl-R from a textboxc# 如何从文本框中捕获 Ctrl-R
【发布时间】:2010-12-20 05:15:10
【问题描述】:

我有一个带有文本框的 from,我正在尝试确定是否在此文本框中按下了 Ctrl-R。我可以使用以下方法分别检测密钥:

private void CheckKeys(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(e.KeyChar == (char)Keys.R)
    {
        // ...
    }
    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
    {
        // ...
    }
}

如何判断它们是否同时按下?

【问题讨论】:

    标签: c# keystroke


    【解决方案1】:

    如果可能,将您的活动更改为KeyDown/KeyUp,一切都会变得更容易。 (请注意,此解决方案并不总是适用)

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
       if (e.KeyData == (Keys.Control | Keys.R))
       {
    
       }
    }
    

    【讨论】:

    • 我认为这会起作用,但我认为在我的情况下,我实际上想要捕捉 KeyUP 事件。原因是如果你按住它,KeyDown 会发出很多。谢谢丹尼。
    • 我喜欢 KeyUp 事件中的这种方法。简单易懂且易于编码。如果需要,也可以通过添加 else if...来检查其他组合键。
    【解决方案2】:

    请参阅 Mitch 关于如何正确构建位标志逻辑的答案,只要他取消删除即可。如果他不决定这样做,这里有一些可行的方法。您基本上需要检查两个条件是否同时为真:

    bool isRKeyPressed = e.KeyChar == (char)Keys.R;
    bool isControlKeyPressed = (Control.ModifierKeys & Keys.Control) == Keys.Control;
    
    if (isRKeyPressed && isControlKeyPressed)
    {
        // Both ...
    }
    else if (isRKeyPressed)
    {
        // R key only ...
    }
    else if (isControlKeyPressed)
    {
        // CTRL key only ...
    }
    else
    {
        // None of these...
    }
    

    扔掉任何你不关心的检查。

    另外,您可能想看看这种替代方法: http://www.codeguru.com/columns/experts/article.php/c4639

    他们覆盖了表单上的ProcessCmdKey 方法(可能在单个控件上?): http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx

    【讨论】:

    • +1 表示“同时检查”逻辑,并建议覆盖 ProcessCmdKey 方法。虽然,我建议您在要从中捕获 Ctrl+R 的 TextBox 控件上执行此操作,而不是在整个表单上执行此操作。你只想在文本框获得焦点时捕捉到它,那么为什么要把它放在表单级别呢?
    • 我试过了,但 isRKeyPressed 总是返回 false。 isControlKeyPressed 是真的。 e.KeyChar 在按下 Ctrl-r 时为 18...当单独按下 R 时为 114。我正在考虑检查是否 e.KeyChar == 18 但我不确定这是否会导致另一个问题。对我来说似乎不是最好的方法
    • @poco:这不会造成问题,只是很多人认为幻数(“18”)是不好的形式。如果您可以使用 Keys 枚举中的常量,那么您应该这样做。据我所知,“18”应该映射到 Alt 键 (Keys.Menu),所以也许你的键盘出现了一些奇怪的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2011-01-06
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多