我正在开发一个应用程序,可以在屏幕上移动第三方应用程序的窗口.
为了概述所有当前打开的窗口,我使用
CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
Run Code Online (Sandbox Code Playgroud)
这将返回定义每个打开窗口的字典数组.这是一个返回的示例字典:
{
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;
},
Run Code Online (Sandbox Code Playgroud)
字典中充满了其他地方使用的良好信息,但缺少可用于修改窗口位置的辅助功能对象.窗口编号清楚地标识Windows.
我现在使用PID(kCGWindowOwnerPID)为窗口的应用程序创建一个辅助功能对象:
AXUIElementRef app = AXUIElementCreateApplication(pid);
Run Code Online (Sandbox Code Playgroud)
然后使用AXUIElementCopyAttributeValues检索应用程序已打开的所有窗口的列表:
NSArray *result;
AXUIElementCopyAttributeValues(
(AXUIElementRef) app,
kAXWindowsAttribute,
0,
99999,
(CFArrayRef *) &result
);
Run Code Online (Sandbox Code Playgroud)
这适用于并返回一组AXUIElements.这是我被困的地方.似乎没有API调用来检索辅助功能对象的窗口号.有没有办法
a)找到辅助功能对象的窗口编号(最终迭代数组并找到正确的窗口)
要么 …
cocoa accessibility macos-carbon objective-c accessibility-api
我正在尝试使用辅助功能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) 我正在开发一个操作属于另一个应用程序的窗口的Mac OS X应用程序.我使用辅助功能.
我已成功移动窗口并从我的应用程序查询其属性.现在我需要让窗口保持"始终在顶部".根据另一篇文章,我需要将窗口级别设置为NSFloatingWindowLevel.这可能超过Accessibility API吗?我没有看到任何与窗口级别对应的Accessibility或Carbon属性.
是否可以快速获取所有带有前台窗口的应用程序的列表,然后设置这些窗口的大小和位置。
我得到了这样的 Windows 属性列表
let type = CGWindowListOption.optionOnScreenOnly
let windowList = CGWindowListCopyWindowInfo(type, kCGNullWindowID) as NSArray? as? [[String: AnyObject]]
for entry in windowList!
{
var owner = entry[kCGWindowOwnerName as String] as! String
var bounds = entry[kCGWindowBounds as String] as? [String: Int]
var pid = entry[kCGWindowOwnerPID as String] as? Int32
print ("\(owner) \(bounds) \(pid) ")
if owner == "Erinnerungen"
{ bounds!["X"] = 0
bounds!["Y"] = 0
print("reset bounds")
let appRef = AXUIElementCreateApplication(pid!); //TopLevel Accessability Object of PID
print(appRef)
var value: AnyObject?
let …
Run Code Online (Sandbox Code Playgroud)