【问题标题】:AXUIElementCopyAttributeValue cannot completeAXUIElementCopyAttributeValue 无法完成
【发布时间】:2015-02-25 23:54:19
【问题描述】:

我正在尝试使用辅助功能 API 来获取活动窗口,问题是当我尝试获取焦点应用程序时,我得到一个无法完成的错误。下面是我的一小段代码:

AXUIElementRef systemElement =
    AXUIElementCreateSystemWide();

AXUIElementRef focused = nullptr;
AXError error = AXUIElementCopyAttributeValue (systemElement,
      kAXFocusedApplicationAttribute, (CFTypeRef*) &focused);

// error value results in kAXErrorCannotComplete

我启用了可访问性,并将我的代码与我在 GitHub 上找到的代码进行了比较,但似乎没有任何效果,而且我的想法很新鲜。也许我忽略了什么?

【问题讨论】:

  • “我收到一个无法完成的错误” 具体是哪一个?请在您的问题中明确并逐字发布编译器错误消息!
  • kAXErrorCannotComplete 是 AXUIElementCopyAttributeValue 操作的返回值。不幸的是,这就是我掌握的所有信息。我将更新我的代码示例以使其更清晰。

标签: c++ macos accessibility osx-yosemite macos-carbon


【解决方案1】:

import Cocoa
//import SwiftUI

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    private let systemWideElement = AXUIElementCreateSystemWide()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.leftMouseUp, handler: keyDown)

    }

    func keyDown(event:NSEvent!) {
        let cgevent = CGEvent(source: nil)!.location
        let y = cgevent.y
        let x = cgevent.x
        var ref: AXUIElement?
        let ret = AXUIElementCopyElementAtPosition(self.systemWideElement, Float(x), Float(y), &ref);
        if ret==AXError.cannotComplete{
            print("error")
        }
        print("key down is \(x),\(y),\(ret)");

    }



}


我有一个类似的问题。我也得到一个无法完成的错误。我已经通过 set com.apple.security.app-sandbox false 解决了这个问题,它位于(你的项目名称).entitlements 中。我认为这会对你有所帮助

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.security.app-sandbox</key>
        <false/>
        <key>com.apple.security.files.user-selected.read-only</key>
        <true/>
</dict>
</plist>

【讨论】:

  • 辅助功能应用在沙盒中不工作(因此不能在 Mac AppStore 上分发)您必须禁用沙盒才能使其工作。
【解决方案2】:

尝试通过首先设置消息超时来解决这个问题:

AXError error_code = AXUIElementSetMessagingTimeout( system_element, 0.1f );

这可能不允许元素正确复制属性值,但它也没有导致事情挂起(这是我得到 kAXErrorCannotComplete 时发生的情况)。尝试收集属性值后,我会将消息传递超时重置为系统默认值:

error_code = AXUIElementSetMessagingTimeout( system_element, 0.0f );

正如我最初所想的那样,这似乎对我的情况没有实际帮助。留下答案,虽然它似乎没有纠正问题,但它可能会为某人提供一些信息。

【讨论】:

  • 不幸的是,这对我不起作用。但我确实找到了解决方法。我没有使用kAXFocusedApplicationAttribute 获取重点应用程序,而是使用GetFrontProcessGetProcessPID。即使它们已被弃用,它们也可以正常工作。如果它们停止工作,您可以将它们替换为文档中的 NS* 变体。
  • 谢谢,我会看看这些,看看是否适合我的情况。我打算回来更新答案,该解决方案实际上并没有解决我的问题,由于某种竞争条件,它碰巧起作用了,这是一种侥幸。问题实际上是在其他软件中,由于它们的启动代码,由于某种原因没有正确处理 AXUIElementCopyAttributeValue()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2015-01-10
  • 2013-10-31
相关资源
最近更新 更多