Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine which screen a window is on given the window ID

Tags:

cocoa

nswindow

Is there a way to get the NSScreen for a window of another process assuming that I have the window id?

I got pretty close with the following code, but the info dictionary doesn't say which screen the window is on.

CFArrayRef windowArray = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSArray*  windowList = (NSArray*)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger count = [windowList count];
for (NSUInteger i = 0; i < count; i++)
{
    NSDictionary*   nswindowsdescription = [windowList objectAtIndex:i];
    NSNumber* windowid = (NSNumber*)[nswindowsdescription objectForKey:@"kCGWindowNumber"];
    if(windowid)
    {
        if ([windowid integerValue] == appWeAreLookingForWindowId)
        {
            Warning(@"Found it: %@", nswindowsdescription);
        }
    }
}
CFRelease(windowArray);

From: CGWindowListCopyWindowInfo, kCGWindowLayer and window level

Here the output:

kCGWindowAlpha = 1;
kCGWindowBounds =     {
    Height = 1010;
    Width = 1600;
    X = 284;
    Y = 43;
};
kCGWindowIsOnscreen = 1; // This is not the screen id, by the way
kCGWindowLayer = 0;
kCGWindowMemoryUsage = 7709736;
kCGWindowName = "osx - CGWindowListCopyWindowInfo, kCGWindowLayer and window level - Stack Overflow";
kCGWindowNumber = 4000;
kCGWindowOwnerName = Safari;
kCGWindowOwnerPID = 240;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
kCGWindowWorkspace = 1;

I could try to calculate the screen from the window bounds, but I'm wondering if there's a better way.

like image 976
Mark Avatar asked Oct 21 '11 14:10

Mark


People also ask

How do I know what window screen I have?

Identify a displaySelect Settings > System > Display > Identify. A number appears on the screen of the display it's assigned to.

How do I reassign a monitor number?

Settings ->System, select Display in the left pane. Click Advanced display settings link. Then click and drag one of the monitors to its correct location. The Identity numbers don't matter.


1 Answers

The reason this information is not available is probably because a window can be on more than one screen at once. If the user has dragged the window so that a portion of it is in one window and the rest in another, there is no such thing as the current screen.

Your window bounds estimation method is probably the best option.

like image 104
Rob Keniger Avatar answered Oct 18 '22 02:10

Rob Keniger