【问题标题】:Using CGEventSetIntegerValueField to edit a keyboard event gives error使用 CGEventSetIntegerValueField 编辑键盘事件会出错
【发布时间】:2011-08-18 05:39:07
【问题描述】:

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

How to tell the difference between a user-tapped keyboard event and a generated one?

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

所以,我正在尝试:

CGEventSetIntegerValueField(myKeyboardEvent, kCGMouseEventPressure, 0xFEEDFACE);

问题是:

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

<Error>: kCGErrorIllegalArgument: CGEventSetIntegerValueField: invalid event

【问题讨论】:

    标签: objective-c macos keyboard-hook


    【解决方案1】:

    0xFEEDFACE 只是一个虚拟值。它是众多4-byte numbers with silly hex spellings 之一,当您查看内存时会脱颖而出。

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

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

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


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

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 2012-03-18
      • 2011-03-06
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      相关资源
      最近更新 更多