我正在研究一个将第三方应用程序的窗口在屏幕上移动的应用程序。通过OSX可访问性获取窗口号API
为了得到当前打开的所有窗口的概述,我用
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;
},
的词典已满的其他地方使用良好的信息,但缺乏可用于修改Windows的位置可访问的对象。窗口号码清楚地标识了Windows。
我现在用的PID(kCGWindowOwnerPID)创建窗口的应用程序可访问对象:
AXUIElementRef app = AXUIElementCreateApplication(pid);
随后检索应用程序使用AXUIElementCopyAttributeValues打开的所有窗口的列表:
NSArray *result;
AXUIElementCopyAttributeValues(
(AXUIElementRef) app,
kAXWindowsAttribute,
0,
99999,
(CFArrayRef *) &result
);
这可以工作并返回一个AXUIElements数组。 这是我卡住的地方。似乎没有API调用来检索辅助功能对象的窗口号。有什么办法要么
a)求的辅助功能对象的窗口编号(最终迭代这个数组,并找到合适的窗口)
或
b)否则清楚地匹配所描述的一个窗口由CGWindowListCopyWindowInfo返回给由AXUIElementCopyAttributeValues返回的辅助功能对象的数组?
对于那些可以使用无证API的应用程序,它将如何完成? – Samuel 2012-08-23 05:01:55