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}
这里,x
和y
是距左上角的距离。
您可以将其添加到您的项目中并修改当前位于最前面的 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 程序。
我正在开发可调整所选 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}
这里,x
和y
是距左上角的距离。
您可以将其添加到您的项目中并修改当前位于最前面的 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 程序。