音量静音按键 - 处理后无法取消事件

本文关键字:取消 事件 处理 | 更新日期: 2023-09-27 18:36:23

我有 C# 应用程序,可以通过 KeyDown 和 KeyPress 事件监控击键。具体来说,它会监视VolumeMute击键(来自手持设备)以执行一些特殊处理。它适用于一个问题:Windows似乎拦截了VolumeMute击键并将系统音量静音(我不想发生这种情况)。我认为 Windows 在我的应用程序处理击键之前会拦截击键,因为即使我发出击键已处理的信号(e.Handle = true),它仍然会使系统音量静音。顺便说一句,相同的代码非常适合我捕获的其他击键(例如退格键等)。

有没有办法阻止 Windows 将此音量静音?

系统: WinXP SP3, .Net 4 Client Profile, Windows Forms app

代码截图

    bool keyHandled = false;
    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (keyHandled)
        {
            e.Handled = true;
        }
    }
    // =====================================
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        keyHandled = false;

        switch (e.KeyCode)
        {
            case Keys.VolumeMute:
                DoSpecialProcessing(); 
                keyHandled = true;
                break;
            default:
                break;
        }
        e.Handled = keyHandled;
    }               

音量静音按键 - 处理后无法取消事件

按钮的作用类似于切换,第一次按下时将静音,下一次按下时将"取消静音"。您所需要的只是再次模拟音量静音按下。

这个答案解释了如何做到这一点。

注意:如果从 KeyDown 处理程序内部调用此方法,则可能需要使用 BeginInvoke 或 PostMessage 将消息发布到消息队列并立即返回,以避免争用条件。

好的。我最终使用AutoHotKey将VolumeMute重新映射到另一个键。重要的是,Windows在重新映射之前永远不会看到VolumeMute击键,并且不会静音。所以我可以在需要时启动这个自动热键重映射脚本。打乱Windows注册表。感谢您的建议。