【问题标题】:Swift and my Idle timer implementation ( missing CGEventType )Swift 和我的空闲计时器实现(缺少 CGEventType)
【发布时间】:2015-08-11 14:01:02
【问题描述】:

在 Objective-c 中,我曾经基于以下 CoreGraphics 调用来实现空闲计时器:

CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType);

现在在 swift 中,使用相同的基本调用,它看起来像:

CGEventSourceSecondsSinceLastEventType(CGEventSourceStateID.CombinedSessionState, CGEventType.MouseMoved)

检查头文件后,例如定义了 CGEventType 的地方,我找不到任何常量的提及,这些常量以我在 ObjC 实现中能够执行的形式执行任何操作。

现在我可以通过查找常量的值并像这样处理它来解决这个问题,但我强烈不希望这样做。我宁愿改用 IOKit 重写。 看起来它基本上被定义为(~0),但就像前面提到的,我宁愿不那样硬编码它。

【问题讨论】:

  • 看起来这段代码没有为 Swift 注释,并且该用例被破坏了。我会归档一个雷达。也就是说,看起来CGEventType.TapDisabledByUserInputkCGAnyInputEventType 具有相同的值。你能看看它是否有效吗?
  • @BrianNickel 看起来它给出了预期的结果,但使用似乎将用于其他东西的东西确实感觉相当可怕......我想我将不得不在未来。

标签: objective-c macos swift cocoa appkit


【解决方案1】:

由于~0 定义是一个标头#define(在CGEventTypes.h 中),它不太可能改变,因为这样做会破坏二进制兼容性。硬编码该值应该是安全的。

所以问题在于获得一个代表kCGAnyInputEventType(又名~0)的CGEventType。

这是一种合理的类型安全的表示方式:

let anyInputEventType = CGEventType(rawValue: ~0)!
CGEventSourceSecondsSinceLastEventType(CGEventSourceStateID.CombinedSessionState, anyInputEventType)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多