【发布时间】:2011-06-26 04:41:37
【问题描述】:
我正在尝试通过 Objective-C 在 iTunes 中自动单击鼠标左键。我正在执行以下操作。
-
首先我正在收听 iTunes 事件
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(allDistributedNotifications:) name:nil object:nil]; -
当调用 allDistributedNotifications 时,我会执行以下操作:
- (void) allDistributedNotifications:(NSNotification *)note { NSString *object = [note object]; NSString *name = [note name]; NSDictionary *userInfo = [note userInfo]; NSLog(@"object: %@ name: %@ userInfo: %@",object, name, userInfo); if([object isEqualToString:@"com.apple.iTunes.dialog"]&& [userInfo objectForKey:@"Showing Dialog"] == 0){ NSLog(@"*** ended iTunes Dialogue"); } if([name isEqualToString:@"com.apple.iTunes.sourceSaved"]){ NSLog(@"*** iTunes saved to file"); currentURLIndex +=1; [self loadWithData:[itmsURLs objectAtIndex:currentURLIndex] fromBot:YES]; } } -
LoadWithData 看起来像这样
-(void) loadWithData:(NSURL*) url fromBot:(BOOL)aBot { BOOL success; success = [[NSWorkspace sharedWorkspace] openURLs:[NSArray arrayWithObject:url] withAppBundleIdentifier:@"com.apple.itunes" options:NSWorkspaceLaunchDefault additionalEventParamDescriptor:nil launchIdentifiers:nil]; if(success){ [numAppsDownloaded setStringValue:[NSString stringWithFormat: @"%lu",currentURLIndex+1]]; } if(success && aBot){ [self performSelector:@selector(clickDownload) withObject:nil afterDelay:0.5]; } } -
依次点击下载是这样的
-(void) clickDownload { NSPoint mouseLoc; mouseLoc = [NSEvent mouseLocation]; //get current mouse position CGPoint point = CGPointMake(mouseLoc.x, mouseLoc.y); CGEventRef theEvent; CGEventType type; CGMouseButton button = kCGMouseButtonLeft; type = kCGEventLeftMouseDown; // kCGEventLeftMouseDown = NX_LMOUSEDOWN, theEvent = CGEventCreateMouseEvent(NULL,type, point, button); NSEvent* downEvent = [NSEvent eventWithCGEvent:theEvent]; [self forwardEvent:downEvent]; [NSThread sleepForTimeInterval:0.2]; type = kCGEventLeftMouseUp; theEvent = CGEventCreateMouseEvent(NULL,type, point, button); NSEvent* upEvent = [NSEvent eventWithCGEvent:theEvent]; [self forwardEvent:upEvent]; }5.最后forwardEvent是这样的
- (void)forwardEvent: (NSEvent *)event { NSLog(@"event: %@",event); pid_t PID; NSInteger WID; // get the iTunes Window ID NSArray* windows = (NSArray*)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID); NSEnumerator* windowEnumerator = [windows objectEnumerator]; while( (window = [windowEnumerator nextObject] ) ) { if([[(NSDictionary*) window objectForKey:@"kCGWindowName"] isEqualToString:@"iTunes"]) WID = (NSInteger)[(NSDictionary*) window objectForKey:@"kCGWindowNumber"]; } ProcessSerialNumber psn; CGEventRef CGEvent; NSEvent *customEvent; NSPoint mouseLoc = [NSEvent mouseLocation]; //get current mouse position NSPoint clickpoint = CGPointMake(mouseLoc.x, mouseLoc.y); customEvent = [NSEvent mouseEventWithType: [event type] location: clickpoint modifierFlags: [event modifierFlags] | NSCommandKeyMask timestamp: [event timestamp] windowNumber: WID context: nil eventNumber: 0 clickCount: 1 pressure: 0]; CGEvent = [customEvent CGEvent]; // get the iTunes PID NSRunningApplication* app; NSArray* runningApps = [[NSWorkspace sharedWorkspace] runningApplications]; NSEnumerator* appEnumerator = [runningApps objectEnumerator]; while ((app = [appEnumerator nextObject])) { if ([[app bundleIdentifier] isEqualToString:@"com.apple.iTunes"]) PID = [app processIdentifier]; } NSLog(@"found iTunes: %d %@",(int)PID,WID); NSAssert(GetProcessForPID(PID, &psn) == noErr, @"GetProcessForPID failed!"); CGEventPostToPSN(&psn, CGEvent); }
问题是我看不到正在执行的鼠标单击。
【问题讨论】:
-
您为什么要注册所有分布式通知?有许多与 iTunes 无关;如果您按名称注册您感兴趣的特定 iTunes 通知,您的代码将更简单,您的应用程序将更有效地运行。其次,您的 forwardEvent: 方法似乎忽略了传递给它的事件,而是创建了一个新事件。第三,您假设鼠标光标位于 iTunes 窗口内,这可能不太可能。
-
这个问题的标题是怎么回事?
标签: objective-c cocoa events mouse itunes