-1

在 Xcode 4.6.1 中工作时,我想获取所有窗口的列表,选择一个特定的窗口(可能通过 windowID)并指定其大小(宽度和高度)和原点(X 和 Y)。

我可以获得屏幕大小,NSStringFromRect 允许我在 NSLog 中查看结果。NSRect 是 {NSPoint 原点;NSSize size;} 并在我的显示 {{0, 0}, {2560, 1440}} 的上下文中。

我使用以下内容来获取我的显示器尺寸。(感谢 Guillaume 关于 C 结构和强制转换的评论):

-(void)awakeFromNib
{
    NSRect screenRect = [[NSScreen mainScreen] frame];
    CGSize myScreenSize = screenRect.size;
    NSLog(@"myScreenSize = %d x %d", (int)myScreenSize.width, (int)myScreenSize.height);

    // returns: myScreenSize = 2560 x 1440
}
@end

我想尝试设置另一个启动的应用程序窗口(不属于我的进程)的大小和原点。

所以首先我得到一个所有正在运行的应用程序的列表,以及每个窗口的 windowID,然后选择一个要移动/调整大小的窗口。

根据其他搜索,这可以使用 CGSPrivate.h 或 Accessibility api 来完成。我不知道如何使用其中任何一个来设置特定 windowID/Number 或 PID 的大小等

#import "rsAppDelegate.h"

@implementation rsAppDelegate

-(void)awakeFromNib
{
    // get the size of the main screen
    NSRect screenRect = [[NSScreen mainScreen] frame];    
    // devrived fromGuillaume's suggestion
    CGSize myScreenSize = screenRect.size;
    CGPoint myScreenOrigin = screenRect.origin;
    NSLog(@"myScreenSize = %d x %d", (int)myScreenSize.width, (int)myScreenSize.height);
    NSLog(@"Origin = %d , %d", (int)myScreenOrigin.x, (int)myScreenOrigin.y);

    // To get a list of Application windows, the PID of the window, the window number, and the window bounds (origin, height, width)   
    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
    for (NSMutableDictionary* entry in (__bridge NSArray*)windowList)
    {
        NSArray *ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
        NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue];
        NSInteger windowNumber = [[entry objectForKey:(id)kCGWindowNumber] integerValue];
        NSArray *ownerBounds = [entry objectForKey:(id)kCGWindowBounds];
        NSLog(@"\nApp = %@ \nAppPID = %ld \nwindowNumber = %ld \nProgramBounds = %@", ownerName, (long)ownerPID, (long)windowNumber, ownerBounds);
    }
    CFRelease(windowList);
    /*
    OUTPUT:
    myScreenSize = 2560 x 1440 | Origin = 0 , 0
    App = Xcode
    AppPID = 3260
    windowNumber = 4493
    ProgramBounds = {
        Height = 1285;
        Width = 1852;
        X = 339;
        Y = 32;
    }
    */

    // Knowing the name of the application, it's PID, window number, and bounds to a percentage of the screen:
    // Set it's origin and size

}
@end

所以现在我知道了屏幕尺寸,并且掌握了每个应用程序中所有窗口的所有可用信息。 如何使用 PID 3260、窗口编号 4493 指定应用程序的新原点、宽度、高度?

newPos = AXValueCreate(kAXValueCGPointType, windowOrigin);
AXUIElementSetAttributeValue(chosenWindow, kAXPositionAttribute, newPos)

newSize = AXValueCreate(kAXValueCGSizeType, windowSize);
AXUIElementSetAttributeValue(chosenWindow, kAXSizeAttribute, newSize);

如何指定 selectedWindow ?我指定什么格式 windowOrigin & windowSize ?

这是我找到的信息,但我不知道如何使用:

kAXValueCGPointType 是 CGPoint 的包装器;参见 CoreGraphics.h 在 AXValue.h 中声明

kAXValueCGSizeType 是 CGSize 的包装器;

这些是其他结构的 AXValueType 包装器。您必须使用 AXValueCreate 和 AXValueGetValue 函数在包装结构和本机结构之间进行转换。

4

1 回答 1

1

首先你需要找出你的窗口在哪里。

NSWindow 类参考...

屏幕

返回窗口所在的屏幕。

- (NSScreen *)screen

返回值

大部分窗口打开的屏幕;当窗口不在屏幕上时为零。

讨论

当窗口部分在一个屏幕上,部分在另一个屏幕上时,将返回其大部分所在的屏幕。

最深的屏幕

返回窗口所在的最深屏幕(它可能被拆分为多个屏幕)。

- (NSScreen *)deepestScreen

返回值

窗口所在的最深屏幕;当窗口不在屏幕上时为零。

然后,当且仅当您的窗口位于一个屏幕上时,您才能确定其大小占某物的百分比。

不过,一般来说,如果不将窗口限制在主屏幕或某些用户选择的屏幕上,您的方法会遇到问题。

否则,您需要考虑如何处理不同的屏幕配置。

您还需要以下 NSApplication 委托方法

applicationDidChangeScreen 参数:

当连接到 > 计算机的显示器的配置发生更改时(以编程方式或当用户在 > 显示器控制面板中更改设置时),由默认通知中心发送。

- (void)applicationDidChangeScreenParameters:(NSNotification *)aNotification 参数

aNotification 一个名为 NSApplicationDidChangeScreenParametersNotification 的通知。调用此通知的对象方法会返回 NSApplication 对象本身。

NSScreen实例有一个frame方法,它返回一个NSRect就像NSWindow做一样。从中可以确定要设置 size.width 和 size.height 的适当高度和宽度,以便在创建用于设置窗口框架的 NSRect 时使用。

获取屏幕框架并访问其高度的示例:

NSRect mainScreenFrameRect = [[NSScreen mainScreen] frame];
CGFloat screenHeight = mainScreenFrameRect.size.height;

从那里获得高度或宽度的百分比很容易计算。

setFrame:display:animate:我建议在您的 applicationDidFinishLaunching 或其他适当的地方使用 NSWindow 方法。(考虑你是否有一个你可能想要的 NSWindow 子类。)

于 2013-04-22T13:29:35.743 回答