NSEvent 有一个方法来获取事件的 subtype
:
可以从 CGEvent 访问相同的 subtype
而不先将其转换为 NSEvent 吗?
CGEventRef eventCG = ...;
NSEvent *eventNS = [NSEvent eventWithCGEvent:eventCG];
short subtypeNS = eventNS.subtype;
short subtypeCG = ???;
CGEvent docs 提到了鼠标事件子类型,似乎与
IOLLEvent.h
中的鼠标子类型相对应。但是,我对查找系统定义的 CGEvents 的子类型特别感兴趣。这些将是
NX_SUBTYPE_AUX_CONTROL_BUTTONS
等,下面或 CG 替代品。/* sub types for mouse and move events */
#define NX_SUBTYPE_DEFAULT 0
#define NX_SUBTYPE_TABLET_POINT 1
#define NX_SUBTYPE_TABLET_PROXIMITY 2
#define NX_SUBTYPE_MOUSE_TOUCH 3
/* sub types for system defined events */
#define NX_SUBTYPE_POWER_KEY 1
#define NX_SUBTYPE_AUX_MOUSE_BUTTONS 7
/*
* NX_SUBTYPE_AUX_CONTROL_BUTTONS usage
*
* The incoming NXEvent for other mouse button down/up has event.type
* NX_SYSDEFINED and event.data.compound.subtype NX_SUBTYPE_AUX_MOUSE_BUTTONS.
* Within the event.data.compound.misc.L[0] contains bits for all the buttons
* that have changed state, and event.data.compound.misc.L[1] contains the
* current button state as a bitmask, with 1 representing down, and 0
* representing up. Bit 0 is the left button, bit one is the right button,
* bit 2 is the center button and so forth.
*/
#define NX_SUBTYPE_AUX_CONTROL_BUTTONS 8
#define NX_SUBTYPE_EJECT_KEY 10
#define NX_SUBTYPE_SLEEP_EVENT 11
#define NX_SUBTYPE_RESTART_EVENT 12
#define NX_SUBTYPE_SHUTDOWN_EVENT 13
#define NX_SUBTYPE_STICKYKEYS_ON 100
#define NX_SUBTYPE_STICKYKEYS_OFF 101
#define NX_SUBTYPE_STICKYKEYS_SHIFT 102
#define NX_SUBTYPE_STICKYKEYS_CONTROL 103
#define NX_SUBTYPE_STICKYKEYS_ALTERNATE 104
#define NX_SUBTYPE_STICKYKEYS_COMMAND 105
#define NX_SUBTYPE_STICKYKEYS_RELEASE 106
#define NX_SUBTYPE_STICKYKEYS_TOGGLEMOUSEDRIVING 107
最佳答案
对于鼠标事件,您可以使用 CGEventGetIntegerValueField
来获取事件的 kCGMouseEventSubtype
属性。
系统定义的事件更棘手。 CGEvents 似乎并没有真正暴露这一点。
简单的部分是匹配事件。只要 CGEvent 使用 NSEvent 和 IOLLEvent 使用的相同事件类型编号,并且只要事件掩码只是 1 << eventType
的简单组合,您就应该能够使用 CGEventMaskBit(NSSystemDefined)
的一些变体进行注册和 CGEventGetType(event) == NSSystemDefined
进行测试。
困难的部分是在不通过 NSEvent 的情况下告诉系统定义事件的子类型是什么。
一种可能性是对鼠标事件做同样的事情(使用 kCGMouseEventSubtype
),但由于 NXEventData
的布局对于鼠标事件和“复合”(包括系统定义的)事件是不同的,我不会指望那个工作.
最有可能的是,无法从 CGEvent 获取系统定义事件的子类型,因此您必须创建一个 NSEvent。
您是否考虑过使用 NSEvent 的事件监视器 API?如果您需要 10.6 或更高版本,您可以通过这种方式捕获事件,并且您已经将它们作为 NSEvents 获取,准备询问它们的子类型。
关于macos - NSEvent `subtype` 相当于 CGEvent?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20864608/