【问题标题】:How to capture combination of Insert+Tab in WinForms?如何在 WinForms 中捕获 Insert+Tab 的组合?
【发布时间】:2012-08-03 12:43:31
【问题描述】:

这不是重复的。许多类似的主题讨论了捕获涉及修饰键的组合。

当从控件按下快捷键(Insert+Tab 的组合)时,我需要触发某些东西,比如Button

赶上

  1. 这不涉及像 AltShift 这样 .NET 已内置检查的修饰键。

  2. 这有Tab 键,不容易被抓到。

我尝试并接近的方法:

1) KeyDown 事件 但不捕获 Tabs..

[DllImport("user32.dll")]
public static extern int GetKeyboardState(byte[] keystate);
static void form_KeyDown(object sender, KeyEventArgs e)
{
    if (!(((Form)sender).ActiveControl is Button))
        return;

    byte[] keys = new byte[255];

    GetKeyboardState(keys);

    if (keys[(int)Keys.Insert] == 129 && keys[(int)Keys.Tab] == 129)
    { 
        // doesn't work
    }
    if (keys[(int)Keys.Insert] == 129 && keys[(int)Keys.J] == 129)
    { 
        // works, since here this doesnt involve Tab
    }
}

这适用于常规组合,不会与Tab 一起触发。

2) KeyPreview 事件 捕获Tab 键,但我不知道如何按下组合键

static void form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
   if (!(((Form)sender).ActiveControl is Button))
        return;

   if (e.KeyCode == Keys.Tab)
      //works

   if (e.KeyCode == Keys.Insert && e.KeyCode == Keys.Tab)
      //doesn't hit.
}

要求:

1) 我没有从 Form 类注册事件。相反,我有一个实用程序类,它创建所有必需的事件(以及其他快捷方式)。我只是将表单实例传递给静态函数。所以我很不确定我应该如何利用各种关键的覆盖调用。这是我的做法:

public frmLogin()
{
    InitializeComponent();
    Utility.SetFormEvents(this);
}

static void SetFormEvents(Form f){
    //foreach control...........
}

但我可以放弃这个..

谢谢..

【问题讨论】:

  • 你能用keyboard hooks试试吗?
  • @UweKeim 我认为可能有一些琐碎的方法......让我看看

标签: c# winforms .net-4.0 keypress keydown


【解决方案1】:

Tab 被认为是一个命令键,您实际上不会收到直接按下它的通知。您可以 PInvoke GetKeyState 方法,但我认为更容易识别选项卡是命令键(并覆盖 ProcessCmdKey)并跟踪插入键是向上还是向下。例如:

static bool insertPressed;
static bool tabPressed;

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if(keyData == Keys.Tab)
    {
        tabPressed = true;
        CheckForTabAndInsert();

    }
    return base.ProcessCmdKey(ref msg, keyData);
}

static void form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Insert)
    {
        insertPressed = true;
        CheckForTabAndInsert();
        insertPressed = false;
    }
}

static void form_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Insert) insertPressed = false;
}

缺点是您只能通过 ProcessCmdKey 真正获得 Tab 的 KeyPress,因此您只能真正支持 Insert+Tab(而不是 Tab+Insert)。这是因为 Tab 用于将上下文从一个控件切换到另一个控件。根据您的情况(即在文本框的上下文中),您可以使用 AcceptTab 属性来可能只使用 KeyUp 和 KeyDown ...但是,从您发布的内容来看,这似乎不是案例。

【讨论】:

  • 看我在另一个班级运行所有这些。如何将ProcessCmdKey 转移到另一个班级?
  • 当你得到ProcessCmdKey时,你可以调用另一个类,当然。
  • 我在问是否可以将整个覆盖函数移动到另一个类。请参阅我的问题中的“要求”部分
猜你喜欢
  • 2011-01-28
  • 2011-08-08
  • 2023-03-24
  • 2010-10-23
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多