我正在尝试使用辅助功能API来改变其他应用程序窗口的位置.我希望做的是从所有应用程序获取屏幕上的所有窗口,然后将它们全部移动到给定的偏移量(比如说5或10)或任何价值).我这样做有困难,因为这是针对我的Objective-C编程的第一天.
这就是我现在正在做的事情.首先,我找到了Windows列表及其PID CGWindowListCopyWindowInfo.然后,对于我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, …Run Code Online (Sandbox Code Playgroud) 我编写了一个代码来检测使用javascript的选择结束,并在最终位置放置一个标记.看到这个jsfiddle:http://jsfiddle.net/vCwwN/
上面的代码执行以下操作:
getClientRects查找所有选择矩形边界,以及用于检测选择方向的黑客(如果向后或不向后).根据这两个信息,它将标记放在末尾.您可以尝试选择上面描述的英文脚本,没有任何问题.唯一的问题是,当你试图处理RTL脚本(如阿拉伯语),则该标记显示在所选择的RTL脚本的开始,而不是结束(其中鼠标/键盘实际上停止).这些导致问题:
基本上,从任何地方开始的选择(LTR或RTL)和以RTL脚本结束是不正确的.任何其他情况都得到了正确处理(例如,从LTR或RTL开始,以LTR结束,甚至在途中通过RTL脚本).
问题是RTL脚本的流向是翻转的,因此向后是向前,向前是向后.这就是为什么我的代码无法正确处理RTL并且后向黑客被逆转的原因.
我想到的一个解决方案是检测选择的最后一个字符,看看它是否有RTL脚本,然后根据这个翻转后退标志.我已经放置了一个函数来检测文本是否以RTL字符结尾(它与未使用的jsfiddle相同).它可能会帮助你,帮我解决它:)