2

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

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

抓住

  1. 这不涉及修饰键,例如Alt.NETShift内置的检查。

  2. 这有Tab不那么容易抓住的关键。

我尝试并接近的:

1)KeyDown 事件但不捕获选项卡..

[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...........
}

但是我可以放弃这个..

谢谢..

4

1 回答 1

1

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

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 ...但是,从您发布的内容来看,情况似乎并非如此。

于 2012-08-06T15:52:36.880 回答