我試圖使用Accessibility API來更改其他應用程序窗口的位置。我想要做的是從所有應用程序獲取屏幕上的所有窗口,然後將它們全部移到給定的偏移量(可以說5或10或任何值)。我在這方面遇到了困難,因爲這是Objective-C編程的第一天。使用Accessibility API在Mac OS X上移動其他窗口
這是我現在正在做的。首先,我使用CGWindowListCopyWindowInfo
找到窗口列表和它們的PID。然後,對於每個窗口,我使用AXUIElementCreateApplication
來獲取窗口的AXUIElementRef
。之後,我應該使用AXUIElementCopyAttributeValue
和屬性kAXPositionAttribute
(我無法獲得正確的位置,總是得到零)。最後,我應該添加想要的偏移量到位置,並使用AXUIElementSetAttributeValue
以及屬性kAXPositionAttribute
和新的位置點(即使我設置了像0,0這樣的絕對值,我也會得到運行時錯誤)。
有人可以幫我做一些上面描述的事情,因爲我嘗試了很多事情,但沒有任何運氣。此外,它不應該完全按照我決定在上面實施它。如果有更好的方法去做,那麼我會很樂意改變它。
更新: 正如評論的要求,這裏是嘗試之一的代碼片段:
// Get all the windows
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSArray* arr = CFBridgingRelease(windowList);
// Loop through the windows
for (NSMutableDictionary* entry in arr)
{
// Get window PID
pid_t pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
// Get AXUIElement using PID
AXUIElementRef elementRef = AXUIElementCreateApplication(pid);
CFTypeRef position;
CGPoint point;
// Get the position attribute of the window (maybe something is wrong?)
AXUIElementCopyAttributeValue(elementRef, kAXPositionAttribute, (CFTypeRef *)&position);
AXValueGetValue(position, kAXValueCGPointType, &point);
// Debugging (always zeros?)
NSLog(@"point=%@", point);
// Create a point
NSPoint newPoint;
newPoint.x = 0;
newPoint.y = 0;
position = (CFTypeRef)(AXValueCreate(kAXValueCGPointType, (const void *)&newPoint));
// Set the position attribute of the window (runtime error over here)
AXUIElementSetAttributeValue(elementRef, kAXPositionAttribute, (CFTypeRef *)&position);
}
後的代碼,使人們可以看到你開始用什麼。 – gaige
這是在步驟解釋,我有什麼不工作,所以我認爲不需要一個不工作的。我已經用這個片段更新了它。 – tria