gpt4 book ai didi

objective-c - 通过 OSX 辅助功能 API 获取窗口编号

转载 作者:太空狗 更新时间:2023-10-30 03:12:18 24 4
gpt4 key购买 nike

我正在开发一个可以在屏幕上移动第三方应用程序窗口的应用程序。

要获得所有当前打开的窗口的概览,我使用

CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);

这将返回定义每个打开窗口的字典数组。这是返回的示例字典:

{
kCGWindowAlpha = 1;
kCGWindowBounds = {
Height = 442;
Width = 475;
X = 3123;
Y = "-118";
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 0;
kCGWindowMemoryUsage = 907184;
kCGWindowName = Untitled;
kCGWindowNumber = 7328;
kCGWindowOwnerName = TextEdit;
kCGWindowOwnerPID = 20706;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
kCGWindowWorkspace = 3;
},

该词典充满了其他地方使用的有用信息,但缺少可用于修改窗口位置的辅助功能对象。窗口由窗口编号清楚地标识。

我现在使用 PID (kCGWindowOwnerPID) 为窗口的应用程序创建一个可访问性对象:

AXUIElementRef app = AXUIElementCreateApplication(pid);

然后检索应用程序使用 AXUIElementCopyAttributeValues 打开的所有窗口的列表:

NSArray *result;

AXUIElementCopyAttributeValues(
(AXUIElementRef) app,
kAXWindowsAttribute,
0,
99999,
(CFArrayRef *) &result
);

这有效并返回一个 AXUIElement 数组。这就是我被困的地方。似乎没有 API 调用来检索可访问性对象的窗口编号。有什么办法吗

a) 找到可访问性对象的窗口编号(最终遍历数组并找到正确的窗口)

最佳答案

我们最终为此任务聘请了一名专门的辅助功能开发人员。

事实证明,如果不使用未记录的 API 就无法做到这一点(在我们的案例中是不行的)。

幸运的是,有一个实用的解决方法:

遍历应用程序所有打开的窗口。获取他们的位置、大小和标题:

AXUIElementCopyAttributeValue(target, kAXPositionAttribute, (CFTypeRef*)&posValue);
AXUIElementCopyAttributeValue(target, kAXSizeAttribute, (CFTypeRef*)&sizeValue);
AXUIElementCopyAttributeValue(target, kAXTitleAttribute, (CFTypeRef*)&titleValue);

接下来,将位置和大小转换为实际的CGPointCGSize 值:

AXValueGetValue(posValue, kAXValueCGPointType, &point);
AXValueGetValue(sizeValue, kAXValueCGSizeType, &size);

将大小、位置和标题与 CGWindowListCopyWindowInfo() 中对象返回的值进行比较。如果它们匹配,您可以安全地假设它是您正在寻找的窗口并使用已经打开的 AXUIElement(在我们的例子中是 target)来处理它。

循环遍历所有打开的窗口的开销在 OSX 上可以忽略不计。同时打开的窗口数量有一个非常低的上限。

此外,虽然这不是 100% 准确(可能 2 个窗口具有相同的位置、大小和标题),但到目前为止,我们在实际使用中还没有遇到过这种情况。

关于objective-c - 通过 OSX 辅助功能 API 获取窗口编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6178860/

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