macOS:如何使网络浏览器成为另一个应用程序的父级

问题描述

我想让我的应用程序成为在 macOS 上运行的 Web 浏览器的子级应用程序,以便在移动浏览器窗口时我的应用程序窗口也会移动。我已经能够为我自己创建的窗口做同样的事情。这是工作片段(来自 macOS: Problem moving child window with Parent window 的帮助):

NSRect frame = NSMakeRect(0,200,200);
NSUInteger styleMask = NSTitledWindowMask;
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask];

NSWindow * window =  [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSbackingStoreBuffered    defer:false];
[window setBackgroundColor:[NSColor blueColor]];
[window makeKeyAndOrderFront:NSApp];

NSRect frame1 = NSMakeRect(0,100,100);
NSUInteger styleMask1 =  NSTitledWindowMask;
NSRect rect1 = [NSWindow contentRectForFrameRect:frame1 styleMask:styleMask1];

NSWindow * window1 =  [[NSWindow alloc] initWithContentRect:rect1 styleMask:styleMask1 backing: NSbackingStoreBuffered    defer:false];
[window1 setBackgroundColor:[NSColor greenColor]];
[window1 makeKeyAndOrderFront:NSApp];

CFRunLoopRun();
[window addChildWindow:window1 ordered:NSWindowAbove];

但是当对实际运行的应用程序做同样的事情时,它不起作用。我在objective-c中编写了以下代码,我在其中获取Google Chrome和Notes应用程序的pid(为POC硬编码)并使Notes成为Google chrome的子代。我认为它不起作用,因为当我移动 Google Chrome 窗口时,Notes 窗口不会移动。我在这里遗漏了什么吗?

NSWindow *appParentwindow = nil;
NSWindow *appChildWindow = nil;
CFArrayRef windowArray = 
CGWindowListcopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements,kCGNullWindowID);
    
CFIndex windowCount = 0;
            
        

if ((windowCount = CFArrayGetCount(windowArray)))
        {
            for (CFIndex i = 0; i < windowCount; i++)
            {
                NSDictionary *windowInfoDictionary = (__bridge NSDictionary *)((CFDictionaryRef)CFArrayGetValueAtIndex(windowArray,i));
                NSNumber *ownerPID = (NSNumber *)(windowInfoDictionary[(id)kCGWindowOwnerPID]);
                //NSNumber *level = (NSNumber *)(windowInfoDictionary[(id)kCGWindowLayer]);
                
                NSNumber *windowIDParent = nil;
                NSNumber *windowIDChild = nil;
                if (ownerPID.intValue == 2286)
                {
                    windowIDParent = windowInfoDictionary[(id)kCGWindowNumber];
                    appParentwindow = [NSApp windowWithWindowNumber:windowIDParent.integerValue];
                }
                if (ownerPID.intValue == 3375)
                {
                    windowIDChild = windowInfoDictionary[(id)kCGWindowNumber];
                    appChildWindow = [NSApp windowWithWindowNumber:windowIDChild.integerValue];
                }
            }
            [appChildWindow setParentwindow:appParentwindow];
        }
        CFRelease(windowArray);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)