Mac OS 列出用户其他WINDOW 以及向其他WINDOW发送消息

- (void)screenShot
{
    
    CFArrayRef windowListArray = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
    
    NSArray *windows = CFBridgingRelease(CGWindowListCreateDescriptionFromArray(windowListArray));
    
    // NSLog(@"All on screen windows: %@", windows);
    // Find window ID of "iTunes" window
//    NSNumber *WindowNumber_ndowNumber = nil;
    for (NSDictionary *window in windows)
    {
        if ([(NSString *)window[(__bridge NSString *)kCGWindowName] isEqualToString:@"iTunes"]) {
            
            [self pressKeyboard:96 toApp:@"iTunes" close:NO];
            
            NSNumber *iTunesWindowNumber = window[(__bridge NSString *)kCGWindowNumber];
            NSDictionary *winInfoDic =[[NSDictionary alloc] initWithDictionary:window];
            NSLog(@"dockWindowNumber: %@", iTunesWindowNumber);
            
            CFRelease(windowListArray);
            
            CGRect bounds;
            
            CGRectMakeWithDictionaryRepresentation((__bridge CFDictionaryRef)[winInfoDic objectForKey:(id)kCGWindowBounds], &bounds);
            CGImageRef image=CGWindowListCreateImage(bounds, kCGWindowListOptionOnScreenOnly,(unsigned int)iTunesWindowNumber, kCGWindowImageDefault);
            NSImage *img=[[NSImage alloc]initWithCGImage:image size:NSZeroSize];
            
            self.imasas.image = img;
            break;
        }
    }
}

- (void)pressKeyboard:(CGKeyCode)kbCode toApp:(NSString *)appNameArr close:(BOOL)isClose
{
    CFArrayRef windowList =CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly |kCGWindowListExcludeDesktopElements,kCGNullWindowID);
    BOOL hasFound = NO;
    for(NSMutableDictionary *entry in (__bridge NSArray *)windowList) {
        NSString *ownerName = [[entry objectForKey:(id)kCGWindowOwnerName]uppercaseString];
        int ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
        NSString *name = [entry objectForKey:(id)kCGWindowName];
        if ([name isEqualToString:appNameArr]) {//检查是否要找的window or app
            ProcessSerialNumber myPSN = {kNoProcess,kNoProcess};
            GetProcessForPID(ownerPID, &myPSN);
            SetFrontProcessWithOptions(&myPSN,kSetFrontProcessFrontWindowOnly);
            [NSThread sleepForTimeInterval:0.2];
            CGEventRef enterKeyUP =CGEventCreateKeyboardEvent(NULL, (CGKeyCode)kbCode,true);
            //CGEventSetFlags(event,kCGEventFlagMaskAlternate | kCGEventFlagMaskControl);
            CGEventPostToPSN(&myPSN, enterKeyUP);//先确保按键没有按下
            CFRelease(enterKeyUP);
            CGEventRef enterKeyDOWN =CGEventCreateKeyboardEvent(NULL, (CGKeyCode)kbCode,false);
            //CGEventSetFlags(event,kCGEventFlagMaskAlternate | kCGEventFlagMaskControl);
            CGEventPostToPSN(&myPSN, enterKeyDOWN);//按键按下
            CFRelease(enterKeyDOWN);
            NSLog(@"press key %@",kbCode==96?@"F5":(kbCode==97?@"F6":(kbCode==98?@"F7":(kbCode==101?@"F9":@"Err"))));
            isClose = YES;
            hasFound=YES;
            break;
        }
        if (hasFound) {
            break;
        }
    }
    CFRelease(windowList);
    if (!hasFound) {
        NSLog(@"no window match %@",appNameArr);
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄权浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值