アクセシビリティ API を使用して、他のアプリケーション ウィンドウの位置を変更しようとしています。私がやりたいことは、すべてのアプリケーションから画面上のすべてのウィンドウを取得し、それらすべてを特定のオフセット (5 または 10 としましょう) に移動することです。または任意の値)。これは私にとってObjective-Cでのプログラミングの初日であるため、これを行うのに苦労しています。
これが私が今していることです。まず、 を使用してウィンドウとその PID のリストを見つけますCGWindowListCopyWindowInfo
。次に、ウィンドウごとに、ウィンドウAXUIElementCreateApplication
の を取得するために使用しAXUIElementRef
ます。その後、AXUIElementCopyAttributeValue
属性で使用する必要がありますkAXPositionAttribute
(適切な位置を取得できず、常にゼロを取得します)。最後に、必要なオフセットを位置に追加AXUIElementSetAttributeValue
し、属性kAXPositionAttribute
と新しい位置ポイントを使用する必要があります (0,0 のような絶対値を設定しても実行時エラーが発生します)。
運が悪くて多くのことを試したので、誰かが私が上で説明したことを行うスニペットで私を助けることができますか. また、上記で実装することにしたとおりである必要はありません。それを行うためのより良い方法があれば、喜んで変更します。
更新: コメントで要求されているように、試みの 1 つのコード スニペットを次に示します。
// 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);
}