相关疑难解决方法(0)

通过OSX Accessibility API获取窗口号

我正在开发一个应用程序,可以在屏幕上移动第三方应用程序的窗口.

为了概述所有当前打开的窗口,我使用

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

22
推荐指数
2
解决办法
5571
查看次数

使用Accessibility API在Mac OS X上移动其他窗口

我正在尝试使用辅助功能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)

macos objective-c accessibility-api window-position

12
推荐指数
1
解决办法
4830
查看次数

在可访问性上设置窗口级别

我正在开发一个操作属于另一个应用程序的窗口的Mac OS X应用程序.我使用辅助功能.

我已成功移动窗口并从我的应用程序查询其属性.现在我需要让窗口保持"始终在顶部".根据另一篇文章,我需要将窗口级别设置为NSFloatingWindowLevel.这可能超过Accessibility API吗?我没有看到任何与窗口级别对应的AccessibilityCarbon属性.

macos objective-c

5
推荐指数
0
解决办法
121
查看次数

快速设置屏幕上所有窗口的大小和位置

是否可以快速获取所有带有前台窗口的应用程序的列表,然后设置这些窗口的大小和位置。

我得到了这样的 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)

macos cocoa swift

2
推荐指数
1
解决办法
1891
查看次数