Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用GetKeys函数获取键盘状态_Macos_Cocoa_Macos Carbon_Core Foundation - Fatal编程技术网

Macos 使用GetKeys函数获取键盘状态

Macos 使用GetKeys函数获取键盘状态,macos,cocoa,macos-carbon,core-foundation,Macos,Cocoa,Macos Carbon,Core Foundation,是否有人知道如何通过GetKeys功能获取任何按键状态(按下或否)? 换句话说,如何处理此功能: bool result = isPressed(kVK_LeftArrow); 谢谢。键映射类型是一个整数数组,但它的实际布局是一系列位,每个键代码一位。特定密钥的位号比虚拟密钥代码小一个 由于位移位对于非常大的值是不合法的(例如,您不能要求编译器移位74位),因此KeyMap类型分为4个部分。您需要将虚拟密钥代码的位号和整数除以32,以找到该位的正确整数;然后用余数计算应该设置哪个位 那么,试试

是否有人知道如何通过GetKeys功能获取任何按键状态(按下或否)? 换句话说,如何处理此功能:

bool result = isPressed(kVK_LeftArrow);

谢谢。

键映射类型是一个整数数组,但它的实际布局是一系列位,每个键代码一位。特定密钥的位号比虚拟密钥代码小一个

由于位移位对于非常大的值是不合法的(例如,您不能要求编译器移位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
}
uint16\u t vKey=kVK\u LeftArrow;
uint8_t index=(vKey-1)/32;
uint8_t shift=((vKey-1)%32);
键映射键状态;
获取密钥(密钥状态);

如果(keyStates[index]&(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
}
uint16\u t vKey=kVK\u LeftArrow;
uint8_t index=(vKey-1)/32;
uint8_t shift=((vKey-1)%32);
键映射键状态;
获取密钥(密钥状态);

如果(keyStates[index]&(1),则它不起作用,因为keyStates[kVK_LeftArrow-1]是一个结构,不能假定为bool,也可以将KeyMap定义为typedef BigEndianUInt32 KeyMap[4];索引kVK_LeftArrow-1大于4。是的……我没有正确陈述。我更新了我的答案,以描述结构的使用方式。我认为我的数学是正确的;也许我在某个地方偏离了1。感谢这个答案。你知道这确实是没有文档记录的。我在developer.apple.com.a上找不到源页面nyway,对于
kVK_ANSI_W
等(顺便说一句,它们不是ASCII顺序),您不需要从vKey中选择-1(这将是错误的)。这不是为我编译的,我必须将其更改为:if((keyStates[index].bigEndianValue&(1感谢您对这一疯狂行为进行说明。它不起作用,因为keyStates[kVK_LeftArrow-1]是一个结构,不能假定为bool,也可以将KeyMap定义为typedef BigEndianUInt32 KeyMap[4];索引kVK_LeftArrow-1大于4。是的……我没有正确陈述。我更新了我的答案,以描述结构的使用方式。我认为我的数学是正确的;也许我在某个地方偏离了1。感谢这个答案。你知道这确实是没有文档记录的。我在developer.apple.com.a上找不到源页面nyway,对于
kVK_ANSI_W
等(顺便说一句,它们不是ASCII顺序),您不需要从vKey中选择-1(这将是错误的)。这不是为我编译的,我必须将其更改为:if((keyStates[index])。bigEndianValue&(1感谢您对这一疯狂行为的解释)。