我正在开发一个在屏幕上移动第三方应用程序窗口的应用程序。
为了概览所有当前打开的窗口,我使用
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 返回的辅助功能对象明确匹配?