MacOS开发系列4-AccessibilityAPI的返回值AXValue的使用教程

1,607 阅读2分钟

历史回顾一下AccessibilityAPI的文章~~~

  1. 开篇AXUIElement的使用。传送门
  2. 第二篇AXObserver的使用。传送门
  3. AXError的介绍。传送门

本文应该就是关于Accessibility的最后一篇介绍了。之后还会继续发表一些关于MacOS开发的技术和实现。欢迎大家持续关注~~~

预热一下之后会更新的主题。预计在春节前完成全部的更新。

  1. 无window、不显示dock,只在StatusBar的APP
  2. MacOS APP开机启动的实现方式
  3. AppleScript的调用方式
  4. 模拟键盘按键的实现

废话不多说,开始正题。

AXValue

在使用AccessibilityAPI 获取AXUIElement的值的时候,会返回AXValue的类型。例如在获取WindowPositionSizeFrame的时候就会出现了。

先看看官方文档中的它,是个什么东东?具体的可自行查阅AXValue.h

AXValue的东西不多,一共就4个函数和一个枚举(只在macOS 10.11可使用)

public enum AXValueType : UInt32 {
    @available(macOS 10.11, *)
    case cgPoint = 1

    @available(macOS 10.11, *)
    case cgSize = 2

    @available(macOS 10.11, *)
    case cgRect = 3

    @available(macOS 10.11, *)
    case cfRange = 4

    @available(macOS 10.11, *)
    case axError = 5

    @available(macOS 10.11, *)
    case illegal = 0
}

public func AXValueGetTypeID() -> CFTypeID

public func AXValueCreate(_ theType: AXValueType, _ valuePtr: UnsafeRawPointer) -> AXValue?

public func AXValueGetType(_ value: AXValue) -> AXValueType

public func AXValueGetValue(_ value: AXValue, _ theType: AXValueType, _ valuePtr: UnsafeMutableRawPointer) -> Bool

那我们来解读一些每个函数的作用。

AXValueGetTypeID这个其实是用于判断你的value是否是一个AXValue类型。

AXValueGetType这个其实是用于获取你的AXValue具体是一个什么类型,如CGPoint、CGSize、CGRect、CFRange等。

AXValueGetValue这个是用于获取具体的值。

AXValueCreate这个是把你具体的值变成AXValue。

那么我们应该如何使用他呢?

创建AXValue

var point:CGPoint = CGPoint.init(x: 100, y: 100)
let pointAXValue:AXValue? = AXValueCreate(.cgPoint, &point)

获取AXValue具体的值

var value = CGPoint.zero
let isSuceess = AXValueGetValue(positionAXValue, .cgPoint, &value)
if isSuceess{
	print("i got the point , value is \(value)")
}else{
	print("faile to get the point")
}

获取AXValue具体值的类型

//假设现在有一个unknowAXValue
if AXValueGetType(unknowAXValue) == AXValueType.cgPoint{
	print("it is CGPoint Type")
}

判断对象是否AXValue类型


假设现在有一个Any类型的对象,名为Obj
if CFGetTypeID(Obj) == AXValueGetTypeID(){
	print("it is AXValue Type")
}else{
	print("Not a AXValue Type")
}