问题描述
我想让我的应用程序成为在 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 (将#修改为@)