我正在开发一个应用程序,可以移动屏幕上第三方应用程序的窗口。
为了获取所有当前打开的窗口的概述,我使用
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
);
这段代码可以正常运行并返回一个AXUIElements数组。 然而,现在的问题是,貌似没有 API 能够获取无障碍对象的窗口编号。有没有任何方法能够实现:
a) 获取无障碍对象的窗口编号(最终目的是迭代遍历数组,并找到正确的窗口)
b) 否则,在 CGWindowListCopyWindowInfo 返回的数组中明确匹配一个窗口与 AXUIElementCopyAttributeValues 返回的无障碍对象?