gpt4 book ai didi

objective-c - OSX/Objective-C 窗口管理 : manipulate the frames & visibility of other applications

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:51 24 4
gpt4 key购买 nike

我想创建一个能够帮助窗口管理的系统工具/应用程序。我正在尝试查找有关以下主题的文档,如果考虑到 OSX 的安全沙箱,它们确实是可能的。

  • 显示带有名称和图标的正在运行的应用程序列表,并允许用户选择一个
  • 在我的应用程序中操纵所述应用程序窗口的框架(例如,调整大小、重新定位)(使用动画——尽管我认为一旦我可以执行实际更改,这将是微不足道的)
  • 在任务管理器等中隐藏或显示这些应用程序。
  • 能够启动(或终止)给定应用程序的实例

在我看来Quicksilver完成了其中的许多事情,但是 AppStore 可用性的缺乏让我想知道是否可以在保留在 OSX 沙箱中的同时做到这一点。

最佳答案

有很多软件可以进行窗口管理。你可以看看我一直在研究的平铺窗口管理器 Amethyst .像这样的软件背后的基本思想依赖于辅助功能(您可以找到 here 的文档)。作为快速概览,API 通过获取对具有属性(隐藏、位置、大小等)的可访问元素(应用程序、窗口、按钮、文本字段等)的引用来工作,其中一些是可写的。

例如,假设您想将每个正在运行的应用程序中的所有窗口移动到屏幕的左上角。该代码可能看起来像

for (NSRunningApplication *runningApplication in [[NSWorkspace sharedWorkspace] runningApplications]) {
AXUIElementRef applicationRef = AXUIElementCreateApplication([runningApplication processIdentifier]);
CFArrayRef applicationWindows;
AXUIElementCopyAttributeValues(applicationRef, kAXWindowsAttribute, 0, 100, &applicationWindows);

if (!applicationWindows) continue;

for (CFIndex i = 0; i < CFArrayGetCount(applicationWindows); ++i) {
AXUIElementRef windowRef = CFArrayGetValueAtIndex(applicationWindows, i);
CGPoint upperLeft = { .x = 0, .y = 0 };
AXValueRef positionRef = AXValueCreate(kAXValueCGPointType, &upperLeft);
AXUIElementSetAttributeValue(windowRef, kAXPositionAttribute, positionRef);
}
}

它说明了如何获取对应用程序及其窗口的引用、如何从无障碍元素复制属性以及如何设置无障碍元素的属性。

NSWorkspace 中记录了各种用于启动和终止应用程序的通知,无障碍框架也具有通知功能,例如应用程序创建或销毁窗口,或窗口小型化或去小型化。

动画化窗口变化是非常重要的,我还没有想出如何去做,尽管它可能是可能的。不访问私有(private) API 可能根本不可能。但是你列出的其他事情应该是可能的。例如,可以通过在应用程序可访问性元素上设置 kAXHiddenAttribute 来隐藏应用程序。启动应用程序实际上可以通过 -[NSWorkspace launchApplication:] 完成。

请注意,使用辅助功能需要用户在 System Preferences > Accessibility 中打开Enable access for assistive devices

关于objective-c - OSX/Objective-C 窗口管理 : manipulate the frames & visibility of other applications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17010638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com