Cocoa MacOSX Lion:如何使用CoreGraphics移动命名窗口,而不使用AppleScript?
在Lion下运行的cocoa objective-c程序中使用CoreGraphics,我想移动另一个进程拥有的命名窗口。我知道我可以通过ASOC的辅助AppleScript方法来完成这项任务,但我希望完全在cocoa中使用CoreGraphics(或者至少完全在C或objective-C中)执行这项任务,而不使用任何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 我知道如何使用下面的代码定位命名进程的命名窗口,但一旦我获得该窗口的信息,我就无法确定如何移动它(请参阅此代码中的注释“我在这里做什么…”)。有没有人能给我
+(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()
)您的解决方案确实是解决方案,但我不知道如何标记它,除了点击按钮说这篇文章对我有用之外,我刚刚注意到了,我也注意到了。我是新来的,所以也许我也错过了一些别的东西。另外,我不允许投票支持你的帖子,也因为我是新来的。无论如何,再次感谢你的帮助。在这个答案的左边,在投票计数器的正下方,找一个白色的复选标记。单击该选项会将其变为绿色,并将问题标记为答案。