2

所以,我在这里问了另一个问题:

如何区分用户点击的键盘事件和生成的键盘事件?

出现的答案之一是使用“鼠标压力”字段(不太可能用于键盘事件)来根据需要标记事件。

所以,我正在尝试:

CGEventSetIntegerValueField(myKeyboardEvent, kCGMouseEventPressure, 0xFEEDFACE);

问题是:

  1. 我不知道什么0xFEEDFACE意思。该值默认为什么?我应该把它设置成什么?如何查看是否已被我标记?
  2. 运行上面的代码给我一个错误:

<Error>: kCGErrorIllegalArgument: CGEventSetIntegerValueField: invalid event

4

1 回答 1

2

0xFEEDFACE只是一个虚拟值。它是许多4 字节数字之一,具有愚蠢的十六进制拼写,当您查看内存时会脱颖而出。

函数接受三个参数:一个事件、一个CGEventField(它是一个enum)和一个int64_t(8 字节有符号整数),其有效值的范围可能取决于该字段。我曾经 0xFEEDFACE表示您可以尝试在其中放置任意“魔术”值*,然后在收到事件时使用CGEventGetIntegerValueField. 如果您的事件点击接收到具有您的“幻数”的新事件,那么它(几乎可以肯定)是由您发送的。否则,它是由系统发送的。

总结并回答您的明确问题:该论点没有默认值;您应该传递事件系统不太可能使用的任意内容(您可能希望检查系统发送的一系列事件以查看“真实”值的样子);这个想法是您的任意值允许您检查事件是否由您标记。

至于错误,看来我错了。我认为您可以在任何类型的事件上设置任何字段(例如,在键盘事件上使用“鼠标压力”字段,因为系统几乎肯定不会设置该字段)以传递任意信息(并且所以确定你自己构建的事件)。然而,事件服务似乎不允许您这样做。可能还有其他字段可以使用,但我不确定。


*我假设你会明白这是一个垃圾值;对不起。

于 2011-08-25T00:03:43.393 回答