Mac OSX: 如何检测选择了NO window?

Mac OSX: How to detect that NO window is selected?

我正在开发可调整所选 window 大小的应用程序。 选择任何 window 时,它会成功运行。但是当没有选择 window 时崩溃。

当前正在从以下代码中获取最前面 window。

AXUIElementCopyAttributeValue(frontMostApp, kAXFocusedWindowAttribute, (CFTypeRef *)&frontMostWindow);

但是如何检测桌面上的控件或所有 windows 都处于非活动状态。

AXUIElementCopyAttributeValue() returns AXError, so you can catch it and then check what happened.

AXError error = AXUIElementCopyAttributeValue(frontMostApp, kAXFocusedWindowAttribute, (CFTypeRef *)&frontMostWindow);
if (error != kAXErrorSuccess) {
    //solve problems here
}

在您的特定情况下,返回错误值:kAXErrorNoValue = -25212

您可以使用 AppleScript 来执行此操作。在 Xcode 中创建新项目时,您可以选择 "Cocoa-AppleScript" 作为您的应用程序类型,方法是在 OS X > 其他下创建一个同时具有 Obj-C 和 AppleScript 的应用程序。您可以使用此代码使具有焦点的应用程序执行某些操作:

tell current app to ...

您可以使用此代码更改 window

的大小
set the bounds of the front window to {x, y, x + width, y + height}

这里,xy是距左上角的距离。

您可以将其添加到您的项目中并修改当前位于最前面的 window 的大小。这意味着具有焦点的应用程序的最前面 window 将被调整大小。这是一个有效且完全交互的示例:

set theWindows to the windows of the current application
if the length of theWindows is 0 then
    display alert "There are no windows to resize"
else
    display dialog "Enter x" default answer ""
    set x to text returned of result as number
    display dialog "Enter y" default answer ""
    set y to text returned of result as number
    display dialog "Enter width" default answer ""
    set width to text returned of result as number
    set width to (x + width)
    display dialog "Enter height" default answer ""
    set height to text returned of result as number
    set height to (y + height)
    tell current application to set the bounds of the front window to {x, y, width, height}
end if

在 Yosemite 中,您可以使用 "Script Editor" 应用程序创建其核心仅包含 AppleScript 的应用程序。在 Mavericks 和旧系统中,该应用程序称为 "AppleScript Editor"。如果您的应用程序的其他部分需要 Objective-C,您可以使用我之前描述的方法创建一个 Cocoa-AppleScript 程序。