Cocoa MacOSX Lion:如何使用CoreGraphics移动命名窗口,而不使用AppleScript?

Cocoa MacOSX Lion:如何使用CoreGraphics移动命名窗口,而不使用AppleScript?,cocoa,window,core-graphics,osx-lion,move,Cocoa,Window,Core Graphics,Osx Lion,Move,在Lion下运行的cocoa objective-c程序中使用CoreGraphics,我想移动另一个进程拥有的命名窗口。我知道我可以通过ASOC的辅助AppleScript方法来完成这项任务,但我希望完全在cocoa中使用CoreGraphics(或者至少完全在C或objective-C中)执行这项任务,而不使用任何AppleScript 我知道如何使用下面的代码定位命名进程的命名窗口,但一旦我获得该窗口的信息,我就无法确定如何移动它(请参阅此代码中的注释“我在这里做什么…”)。有没有人能给我

在Lion下运行的cocoa objective-c程序中使用CoreGraphics,我想移动另一个进程拥有的命名窗口。我知道我可以通过ASOC的辅助AppleScript方法来完成这项任务,但我希望完全在cocoa中使用CoreGraphics(或者至少完全在C或objective-C中)执行这项任务,而不使用任何AppleScript

我知道如何使用下面的代码定位命名进程的命名窗口,但一旦我获得该窗口的信息,我就无法确定如何移动它(请参阅此代码中的注释“我在这里做什么…”)。有没有人能给我指一些文件,或者给我一个建议,告诉我怎么做

提前谢谢

+(boolean_t)moveWindow:(NSString*)windowName ofProcess:(NSString*)processName to:(CGPoint*)location {

    boolean_t result = false;

    if (windowName == nil || processName == nil || location == nil) {
        return (result);
    }

    CFArrayRef windows = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
    CFIndex   nWindows = CFArrayGetCount(windows);

    for (CFIndex i = 0; i < nWindows; i++) {
        CFDictionaryRef windict = CFArrayGetValueAtIndex(windows, i);
        CFNumberRef winOwnerPidRef = CFDictionaryGetValue(windict, kCGWindowOwnerPID);
        if (winOwnerPidRef == nil) {
            continue;
        }
        pid_t winOwnerPid = 0;
        CFNumberGetValue(winOwnerPidRef, kCFNumberSInt32Type, (int*)&winOwnerPid);
        if (winOwnerPid < 1) {
            continue;
        }
        ProcessSerialNumber winOwnerPSN;
        GetProcessForPID(winOwnerPid, &winOwnerPSN);

        NSString* winOwner = nil;

        ProcessSerialNumber psn;
        psn.lowLongOfPSN  = kNoProcess;
        psn.highLongOfPSN = 0;

        while (winOwner == nil && GetNextProcess(&psn) == noErr) {

            if (psn.lowLongOfPSN  != winOwnerPSN.lowLongOfPSN ||
                psn.highLongOfPSN != winOwnerPSN.highLongOfPSN) {
                continue;
            }
            CFStringRef procName = NULL;
            if (CopyProcessName(&psn, &procName) == noErr) {
                winOwner = (NSString*) procName;
            }
            CFRelease(procName);
        }

        if (winOwner == nil || [winOwner compare:processName] != NSOrderedSame) {
            continue;
        }

        CFStringRef winNameRef = CFDictionaryGetValue(windict, kCGWindowName);
        NSString* winName = (NSString*) winNameRef;
        if (winName != nil && [winName compare:windowName] == NSOrderedSame) {
            // ********************************************** //
            // What do I do here in order to move the window? //
            // ********************************************** //
            result = true;
            break;
        }
    }

    return (result);
}
+(布尔值)移动窗口:(NSString*)进程的窗口名:(NSString*)进程名到:(CGPoint*)位置{
布尔结果=假;
if(windowName==nil | | processName==nil | | location==nil){
返回(结果);
}
CFArrayRef windows=CGWindowListCopyWindowInfo(kcgwindowlistoptionnscreenOnly,kCGNullWindowID);
CFIndex nWindows=CFArrayGetCount(窗口);
对于(CFIndex i=0;i
您可以使用辅助功能移动其他应用程序的窗口。查看属性为kAXPositionAttribute的
AXUIElementCreateApplication()
AXUIElementSetAttributeValue()


请注意,需要启用可访问性(选中“Universal access Preferences”中的“启用辅助设备的访问”),或者需要信任您的进程(请参见
AXMakeProcessTrusted()

您的解决方案确实是解决方案,但我不知道如何标记它,除了点击按钮说这篇文章对我有用之外,我刚刚注意到了,我也注意到了。我是新来的,所以也许我也错过了一些别的东西。另外,我不允许投票支持你的帖子,也因为我是新来的。无论如何,再次感谢你的帮助。在这个答案的左边,在投票计数器的正下方,找一个白色的复选标记。单击该选项会将其变为绿色,并将问题标记为答案。