Я пытаюсь использовать API Accessibility для изменения положения других окон приложений. Что я хочу сделать, так это получить все окна на экране из всех приложений, затем переместите их все заданное смещение (скажем, 5 или 10 или любое значение). У меня возникают трудности с этим, так как это день для программирования в Objective-C для меня.Перемещение других окон в Mac OS X с помощью API Accessibility
Вот что я делаю прямо сейчас. Во-первых, я нахожу список окон и их PID, используя CGWindowListCopyWindowInfo
. Затем для каждого окна я использую AXUIElementCreateApplication
, чтобы получить окно AXUIElementRef
. После этого я должен использовать AXUIElementCopyAttributeValue
с атрибутом kAXPositionAttribute
(который я не получаю в правильной позиции, всегда получаю нули). Наконец, я должен добавить желаемое смещение в позицию и использовать AXUIElementSetAttributeValue
с атрибутом kAXPositionAttribute
и новой точкой позиции (для которой я получаю ошибки во время выполнения, даже если я устанавливаю абсолютные значения, такие как 0,0).
Может кто-нибудь помочь мне со сниппетом, выполняющим то, что я описал выше, поскольку я пробовал много вещей без везения. Кроме того, это не должно быть точно так, как я решил реализовать его выше. Если есть лучший способ сделать это, я буду рад изменить его.
Update: В соответствии с просьбой в комментарии, вот фрагмент кода одного из попыток:
// 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);
}
Post код одного из ваших попыток, чтобы люди могли видеть, что вы начали. – gaige
Это было объяснено шагами, и то, что у меня было, не работает, поэтому я не думал, что вам нужно работать. Я обновил его с помощью фрагмента. – tria