在 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 函数在包装结构和本机结构之间进行转换。