【问题标题】:Suppressing global windows shortcuts while recording keypresses在录制按键时抑制全局窗口快捷方式
【发布时间】:2015-08-30 21:13:21
【问题描述】:

是否可以在录制按键时抑制 windows 全局快捷键?

我有一个用 c# 编写的 Windows 窗体应用程序,并使用这个库来记录按键以便以后在宏中使用。现在,当我记录 Windows 使用的组合键(即 L Control + Win + Right Arrow 以更改 Win 10 上的虚拟桌面)时,我希望我的应用程序记录它,但在我记录时避免 Windows 实际使用它很烦人。

我有一个复选框可以在点击事件时启用键捕获

m_KeyboardHookManager.KeyDown += HookManager_KeyDown;

HookManager_KeyDown 就是这样

private void HookManager_KeyDown(object sender, KeyEventArgs e)
{
    Log(string.Format("KeyDown \t\t {0}\n", e.KeyCode));
    string [] sArr = new string [2];
    if (keyBindingArea1.Text != "")
    {
        sArr[0] = keyBindingArea1.Text;
        sArr[1] = string.Format("{0}", e.KeyCode);

        keyBindingArea1.Text = string.Join("+", sArr);
    }
    else
    {
        keyBindingArea1.Text = string.Format("{0}", e.KeyCode);
    }
}

在 comboText 控件中显示组合键。 (此代码直接取自软件包附带的演示。

现在录制效果很好,例如我按下 L Control + Win,然后松开按键并按下第三个键(即右箭头),这不会触发 Windows 快捷方式,但让它像这样工作很烦人那个。

感谢任何帮助。谢谢

【问题讨论】:

    标签: c# mousekeyhook


    【解决方案1】:

    尝试使用事件的e.Handled 属性。如果将其设置为true,它将终止密钥处理链。通常,处理链中的其他应用程序不会得到它。我不确定它是否适用于像虚拟桌面切换这样的低级别 Windows 人员。

        private void OnKeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            bool isThirdKey = //Some state evaluation to detect the third key was pressed
            if (isThirdKey) e.Handled = true;
        }
    

    【讨论】:

    • 我已经尝试过了,但是没有用。例如,它检测到我正在按下左 Win 键,但它不会抑制它。我用过的代码:if (e.KeyCode == Keys.LWin || e.KeyCode == Keys.RWin) { e.Handled = true; }
    • 尝试一些简单的键,比如说'a'。启动您的应用程序并在记事本中键入“a”-s。您将看到“a”被正确抑制。然后打开让我们说 Microsoft Word 并重复相同的操作。您会发现抑制不适用于 Word。原因是Word本身使用了钩子,你没有机会压制它。正如我所说,某些应用程序不能被“欺骗”。在这篇文章中查看@Hans Passant 的 cmets:stackoverflow.com/questions/31054486/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2022-12-09
    相关资源
    最近更新 更多