【问题标题】:Getting keyboard state using GetKeys function使用 GetKeys 函数获取键盘状态
【发布时间】:2012-07-13 07:49:42
【问题描述】:

有谁知道如何通过 GetKeys 函数获取任何键状态(按下或否)? 换句话说如何处理这个函数:

bool result = isPressed(kVK_LeftArrow);

谢谢。

【问题讨论】:

    标签: macos cocoa macos-carbon core-foundation


    【解决方案1】:

    KeyMap 类型是一个整数数组,但它的实际布局是一系列位,每个键码一个位。特定键的位数比虚拟键码少一个

    由于位移对于非常大的值是不合法的(例如,您不能只要求编译器位移 74 位),所以 KeyMap 类型分为 4 个部分。您需要获取虚拟键码的位数并除以 32 以找到该位的正确整数;然后取余数来确定应该设置哪个位。

    那么,试试这个:

    uint16_t vKey = kVK_LeftArrow;
    uint8_t index = (vKey - 1) / 32;
    uint8_t shift = ((vKey - 1) % 32);
    KeyMap keyStates;
    GetKeys(keyStates);
    if (keyStates[index] & (1 << shift))
    {
        // left arrow key is down
    }
    

    【讨论】:

    • 它不起作用,因为 keyStates[kVK_LeftArrow - 1] 是一个结构,不能假定为 bool,KeyMap 也定义为 typedef BigEndianUInt32 KeyMap[4];并且索引 kVK_LeftArrow - 1 大于 4。
    • 是的...我没有正确说明。我已经更新了我的答案以描述应该使用该结构的方式。我认为我的数学是正确的;也许我在某个地方差了 1 点。
    • 感谢您的回答。你知道这在任何地方都没有记录。我在 developer.apple.com 上找不到源页面。无论如何,对于kVK_ANSI_W 等(顺便说一下,它们不是按ASCII 顺序排列的),您不需要需要从vKey 中取-1(这将是错误的)。
    • 这没有为我编译,我不得不将其更改为:if ((keyStates[index].bigEndianValue & (1
    • 感谢您对这种疯狂行为有所了解。
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 2011-04-08
    • 2011-11-02
    • 2011-08-11
    • 1970-01-01
    • 2015-12-23
    • 2013-07-08
    • 2021-02-22
    相关资源
    最近更新 更多