【问题标题】:c# listening to keyboard combinationc#听键盘组合
【发布时间】:2018-12-08 05:51:54
【问题描述】:

我想写一个简单的program 在某些地方发送我的用户名和密码,例如当我想登录网站时,我发现this 项目正在听键盘。

所以我有这个功能:

private void HookManager_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{

}

private void HookManager_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{

}

private void HookManager_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

}

当我按下键时,例如a,我得到了这样的结果:

int value = e.KeyValue; // 65
Keys key = e.KeyCode;   // A

所以我想知道如何捕捉特定的keyboard combination 而不仅仅是一个key,例如Ctrl + l

【问题讨论】:

标签: c# winforms keyboard-events


【解决方案1】:

您可以将这样的代码用于 KeyDown:

if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
}

基于来自 MSDN 的 KeyEventArgs 文档:

每个 KeyDown 或 KeyUp 事件都会传递一个 KeyEventArgs,它指定用户按下的键以及是否同时按下了任何修饰键(CTRL、ALT 和 SHIFT)。

KeyDown 事件在用户按下任意键时发生。 KeyUp 当用户释放键时发生事件。重复的 KeyDown 事件 每次按键重复时发生,如果按键被按住,但只有一个 用户释放按键时会产生 KeyUp 事件。

KeyPress 事件也会在按键被按下时发生。一种 KeyPressEventArgs 与每个 KeyPress 事件一起传递,并指定 每次按键后组成的字符。

【讨论】:

  • 在whan函数下? (KeyUp\KeyDown\KeyPress)
  • KeyDown下的这个具体
  • 对于 Ctrl + L,您将拥有:if (e.Control && e.KeyCode == Keys.L)
  • 这行不通,我也尝试了另一个相同的结果,它似乎 e.Alt \ e.Control \ e.Shift 总是错误的
  • 我现在检查了您正在使用的项目,它似乎基于 Win32 API,并且清楚地提到对于多个键,您需要跟踪哪些键被释放 (KeyUp) .我的答案代码通常适用于 WinForm 控件,但可能不适用于此。如果您能更好地描述您的情况,也许我们可以帮助您。
【解决方案2】:

覆盖ProcessDialogKey() 方法是通用解决方案:

protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.I))
        {
            MessageBox.Show("Ctrl+I");
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 2011-04-08
    • 1970-01-01
    • 2017-09-08
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多