3

有什么方法可以将以下 applescript 转换为 Objective-C/C?

tell application "System Events" to set visible of process "Safari" to false

我知道我可以使用NSAppleScript类或调用在Objective-C中执行这个applescript system("osascript -e '...'"),但是没有其他方法吗?

applescript 如何做到这一点?

或者,我可以从 Objective-C/C 的另一个应用程序中隐藏一个窗口吗?

更新:

我发现你可以使用SBApplication类来做到这一点:

SBApplication *SystemEvents = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
/*SystemEventsApplicationProcess*/ id Safari = [[SystemEvents performSelector:@selector(applicationProcesses)] objectWithName:@"Safari"];
[Safari setVisible:NO]; // Doesn't work!

然而,这不起作用,因为setVisible可能不符合我的想法。

这是 的类层次结构SystemEventsApplicationProcess

SystemEventsApplicationProcess : SystemEventsProcess : SystemEventsUIElement : SystemEventsItem : SBObject : NSObject

SystemEventsXXX以下是这些类可用的方法:

SystemEventsApplicationProcess
    applicationFile

SystemEventsProcess
    setVisible:
    visible
    unixId
    totalPartitionSize
    shortName
    partitionSpaceUsed
    name
    id
    hasScriptingTerminology
    setFrontmost:
    frontmost
    fileType
    file
    displayedName
    creatorType
    Classic
    bundleIdentifier
    backgroundOnly
    architecture
    acceptsRemoteEvents
    acceptsHighLevelEvents
    windows
    menuBars

SystemEventsUIElement
    select
    clickAt:
    setValue:
    value
    title
    subrole
    setSize:
    size
    setSelected:
    selected
    roleDescription
    role
    setPosition:
    position
    orientation
    name
    minimumValue
    maximumValue
    help
    setFocused:
    focused
    entireContents
    enabled
    objectDescription
    objectClass
    accessibilityDescription
    windows
    valueIndicators
    UIElements
    toolBars
    textFields
    textAreas
    tables
    tabGroups
    staticTexts
    splitterGroups
    splitters
    sliders
    sheets
    scrollBars
    scrollAreas
    rows
    relevanceIndicators
    radioGroups
    radioButtons
    progressIndicators
    popUpButtons
    popOvers
    outlines
    menuItems
    menuButtons
    menuBarItems
    menuBars
    menus
    lists
    incrementors
    images
    growAreas
    groups
    drawers
    comboBoxes
    columns
    colorWells
    checkboxes
    buttons
    busyIndicators
    browsers
    attributes
    actions

SystemEventsItem
    setName:
    name
    id
    removeActionFromUsingActionName:usingActionNumber:
    pick
    keyUp
    keyDown
    increment
    editActionOfUsingActionName:usingActionNumber:
    doScript
    doFolderActionFolderActionCode:withItemList:withWindowSize:
    decrement
    confirm
    cancel
    attachedScripts
    attachActionToUsing:
    stop
    start
    saveAs:in:
    moveTo:
    exists
    duplicateTo:withProperties:
    delete
    closeSaving:savingIn:
    setProperties:
    properties
    objectClass

SBObject
    // ...
NSObject
    // ...
4

2 回答 2

2

您可以使用NSRunningApplication,它代表(顾名思义)一个正在运行的应用程序,并且有一个-hide方法。

NSWorkspace将为您提供所有正在运行的应用程序的列表:[[NSWorkspace sharedWorkspace] runningApplications]您可以对其进行过滤,或者您可以使用其捆绑标识符获取表示 Safari 的对象:(+[NSRunningApplication runningApplicationsWithBundleIdentifier:]请注意,如果同一应用程序有多个运行实例,则实际上返回一个数组)。

于 2012-08-04T19:50:25.690 回答
2

除非您将脚本桥接框架添加到您的项目和其他一些东西,否则代码将无法工作。你有没有这样做...我不知道。如果您需要说明,此链接似乎很好地解释了所需内容。

顺便说一句,“设置可见”意味着隐藏应用程序,就像从应用程序菜单中隐藏它一样。但是,如果您想隐藏一个应用程序,我确信有一个 NSWorkspace 方法。

最后一点建议......对于只有几行 applescript 代码 NSApplescript 将是您的最佳选择。如果您打算使用大量 applescript 脚本代码,那么脚本桥是更好的选择,尽管我自己经常只是在我的项目中放置一个已编译的脚本,然后使用 NSApplescript 从该脚本启动处理程序。您也可以使用 ApplescriptObjC 语言。你有很多选择。

于 2012-08-04T19:52:09.287 回答