Mac OSX:如何检测到NO窗口被选中?

时间:2015-02-03 12:03:38

标签: objective-c macos osx-mavericks osx-mountain-lion osx-yosemite

我正在处理调整所选窗口大小的应用程序。 选择任何窗口时,它都能成功运行。但是没有选择窗口时会崩溃。

目前从以下代码中获取最前面的窗口。

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

但如何检测该控件是在桌面上还是所有窗口都处于非活动状态。

2 个答案:

答案 0 :(得分:3)

AXUIElementCopyAttributeValue()返回AXError,因此您可以捕获它,然后check what happened

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

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

答案 1 :(得分:1)

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

tell current app to ...

您可以使用此代码更改窗口的大小

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

此处,xy是距离左上角的距离。

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

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中,您可以创建没有任何内容的应用程序,但AppleScript使用“脚本编辑器”应用程序。在Mavericks和旧系统中,该应用程序称为“AppleScript编辑器”。如果您需要Objective-C用于应用程序的其他部分,您可以使用我之前描述的方法创建Cocoa-AppleScript程序。