c# - 如何在 WinForms 中捕获 Insert+Tab 的组合?

标签 c# winforms .net-4.0 keypress keydown

这不是重复的。许多类似的线程讨论了捕获涉及修改键的组合。

我需要在从控件按下快捷键(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...........
}

但是我可以放弃这个..

谢谢..

最佳答案

Tab 被认为是命令键,您实际上不会收到直接按下它的通知。你可以 PInvoke GetKeyState方法,但我认为更容易识别 Tab 是命令键(并覆盖 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 ...但是,从您发布的内容来看,情况似乎并非如此。

关于c# - 如何在 WinForms 中捕获 Insert+Tab 的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11830079/

相关文章:

c# - Visual Studio 运行 .NET 应用程序中的调试日志文件位置

c# - WPF 中的 Windows 图标属性,需要标记扩展吗?

c# - 命令执行后调用事件

c# - 将数据从文本框存储到 appconfig 中

c# - 在表单的激活事件中将其他表单置于前面时出现问题

security - 安全透明方法 X 尝试访问安全关键方法 Y 失败

c# - 定位windows系统日期时间时钟窗口

c# - 当鼠标在 datagridview 行中时显示每个项目的工具提示

c# - 组合框出于某种原因被链接

c# - 多个数据库上的 PetaPoco