【问题标题】:Which message should I handle if I need to detect a keyboard shortcut?如果我需要检测键盘快捷键,我应该处理哪条消息?
【发布时间】:2011-01-27 08:09:12
【问题描述】:

假设我正在我的应用程序中寻找键盘快捷键 Alt+C。我相信出于各种原因我一定不能处理WM_KEYDOWN,一个是它用于检测非系统键并且没有具体告诉您 Alt 键。它只有一个 1 位平面来告诉您是否与虚拟键一起按下了 任何 扩展键。

我相信WM_CHAR 在这里更适合我。我的问题是:

a) 我的假设是否正确?

b) 我如何从wParam 获取字符代码并将其与例如 Alt+C 进行比较? p>

【问题讨论】:

  • 您是在编写 Windows 窗体还是 wpf 应用程序?如果是这样,您是否有理由不关注 KeyDown/KeyUp/KeyPress 事件?
  • 对不起,我忘了提。我正在编写 VSTO Office 加载项,因此键盘事件不可用。

标签: c# winapi keyboard keyboard-shortcuts


【解决方案1】:

您可以使用 WM_SYSKEYDOWN 和 WM_SYSCHAR 来检测 Alt 按键。

你有更多信息this article

a) 不,WM_CHAR 不会检测并按 alt 键。

【讨论】:

  • 非常感谢。多么巧合,当我发布这个问题时,我正处于那篇文章的中间。非常感谢。
  • 还有一个问题,对于 WM_SYSCHAR,我如何将 wParam 中的字符代码与我要查找的字符(在本例中为字符 C)进行比较?我在 C# 中这样做。如果是 C 或 C++,这将是一个直接的比较。你能告诉我是否需要将字符代码与虚拟键的整数值进行比较?
  • 我认为您必须比较整数代码以查看它是否与该字符的 ascii 表示匹配。
【解决方案2】:

对于一般的键盘快捷键处理,最好使用Control.ProcessCmdKey 覆盖。

在 Win32 中称为键盘加速器。

我没有Control.ProcessCmdKey的直接经验,但它看起来很容易做到。

通过 Google 搜索找到的示例: http://www.codeguru.com/columns/experts/article.php/c4639

protected override bool ProcessCmdKey( ref Message msg, 
                                       Keys keyData )
{
    // Check this key...
    bool bHandled = false;

    // Look up value
    Accelerators accel = Accelerators.Unspecified;
    if ( _accelHash.ContainsKey(AcceleratorKey(keyData)) )
    {
        accel = (Accelerators)_accelHash[key];

        switch ( accel )
        {
            case Accelerators.Home:
                DisplayHome();
                bHandled = true;
                break;

            case Accelerators.Save:
                Save();
                bHandled = true;
                break;

            case Accelerators.Print:
                Print();
                bHandled = true;
                break;

            case Accelerators.Logout:
                LogOut();
                bHandled = true;
                break;

            case Accelerators.Unspecified:
            default:
                break;

        } // switch
    } // if

    return bHandled;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2016-02-05
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多