A window is just a place, where an application can do its drawing, like drawing a button, text or other stuff.
For Linux
On Linux or UNIX like systems, there is a tool called xwininfo
, which can be used to list all the windows, on a system. Hence you would be able to get, the windows IDs, and names.
Additionally, xwininfo
can be used, to get the attributes of a specific window, such as, where it is located , its width , height.
Having gotten a window id, you can also query a window for its properties, using xprop . A window property, is a way to exchange information, between windows.
- $ xwininfo -root -tree
- # List all windows, starting
- # from the root of the screen, in
- # a tree manner.
- # The window id is displayed,
- # so for example, for the
- # Calculator window, its id is
- # 0x800011.
- # In addition to the window id,
- # its name is displayed, so for
- # the window which has an id of
- # 0x800011 ,its name is calculator.
- xwininfo: Window id: 0xac (the root window) (has no name)
- Root window id: 0xac (the root window) (has no name)
- Parent window id: 0x0 (none)
- 2 children:
- 0x800011 "Calculator": ("xcalc" "XCalc") 226x394+59+82 +59+82
- 1 child:
- 0x800012 (has no name): () 226x394+0+0 +59+82
- 56 children:
- 0x80004b (has no name): () 216x46+4+2 +63+84
- 1 child:
- 0x80004c (has no name): () 204x38+6+2 +70+87
- 10 children:
- 0x800056 (has no name): () 10x15+4+2 +75+90
- 0x800055 (has no name): () 186x17+18+2 +89+90
- ...
- 0x80004e (has no name): () 26x15+146+21 +217+109
- 0x80004d (has no name): () 26x15+146+21 +217+109
- 0x80004a (has no name): () 40x26+4+62 +63+144
- 0x800049 (has no name): () 40x26+48+62 +107+144
- 0x800048 (has no name): () 40x26+92+62 +151+144
- ...
- 0x800015 (has no name): () 40x26+136+362 +195+444
- 0x800014 (has no name): () 40x26+180+362 +239+444
- 0x600000 "xwinclip": () 500x500+1+1 +1+1
- $ xwininfo -name Calculator
- # List the attributes, of the
- # Calculator window, as in its
- # width, height, x and
- # y positions ..
- xwininfo: Window id: 0x800011 "Calculator"
- Absolute upper-left X: 59
- Absolute upper-left Y: 82
- Relative upper-left X: 59
- Relative upper-left Y: 82
- Width: 226
- Height: 394
- Depth: 24
- Visual: 0x21
- Visual Class: TrueColor
- Border width: 0
- Class: InputOutput
- Colormap: 0x20 (installed)
- Bit Gravity State: NorthWestGravity
- Window Gravity State: NorthWestGravity
- Backing Store State: NotUseful
- Save Under State: no
- Map State: IsViewable
- Override Redirect State: no
- Corners: +59+82 -1081+82 -1081-292 +59-292
- -geometry 226x394+59+82
- $ xprop -name Calculator
- # List the properties, of the
- # window, named Calculator. A
- # property is used to exchange
- # information, for example,
- # between the window, and the
- # window manager.
- WM_STATE(WM_STATE):
- window state: Normal
- icon window: 0x0
- WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW
- WM_CLIENT_LEADER(WINDOW): window id # 0x800011
- WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
- WM_CLASS(STRING) = "xcalc", "XCalc"
- WM_HINTS(WM_HINTS):
- Client accepts input or input focus: True
- Initial state is Normal State.
- bitmap id # to use for icon: 0x636c6163
- WM_NORMAL_HINTS(WM_SIZE_HINTS):
- program specified size: 226 by 394
- window gravity: NorthWest
- WM_CLIENT_MACHINE(STRING) = "IESOUIP-OIDMS1P"
- WM_COMMAND(STRING) = { "xcalc" }
- WM_ICON_NAME(STRING) = "Calc"
- WM_NAME(STRING) = "Calculator"
For windows
For Microsoft windows, there are multiple alternatives, to xwininfo
, and xprop
, that can be used. The most prominent one, is the Spy++
application.
Spy++
, allows to to display a list of all the windows. Additionally, for each listed window, you can get a list of its attributes, such as its bounding rectangle, its window procedure, its extended and window styles, the process and thread ids, which have created the window …
Additionally, Spy++
allows to view the messages, which are delivered to a window, such as WM_CREATE
, for when the window is created, or WM_KEYDOWN
, for when a key is down.





The Spy++
application, can be downloaded from here . It can also be installed, by installing visual studio.
Additional information, about Spy++, can be found here .
macOS
For Apple macOS, there is no software, similar to Spy++
, which can be used to list all the windows, and their attributes, but this can be done using the following code.
- #import <Cocoa/Cocoa.h>
- #include <stdio.h>
- CFComparisonResult
- sortWindow
- (CFDictionaryRef window_1, CFDictionaryRef window_2, CFStringCompareFlags compareOptions ){
- //Sort windows using their window number
- NSInteger window_number_1 = [[window_1 objectForKey:(id ) kCGWindowNumber ] integerValue ];
- NSInteger window_number_2 = [[window_2 objectForKey:(id ) kCGWindowNumber ] integerValue ];
- if (window_number_1 > window_number_2 )
- return kCFCompareGreaterThan;
- else if (window_number_1 < window_number_2 )
- return kCFCompareLessThan;
- return kCFCompareEqualTo; }
- int
- main
- (int argc, char* argv[ ] ){
- NSAutoreleasePool* pool = [[NSAutoreleasePool alloc ] init ];
- NSArray* windows = [(NSArray* ) CGWindowListCopyWindowInfo (kCGWindowListOptionOnScreenOnly, kCGNullWindowID ) autorelease ];
- /* Generate and return information about windows, in current user session,
- kCGWindowListOptionOnScreenOnly will list all the windows,
- which are currently on screen .*/
- CFArraySortValues (windows,
- CFRangeMake (0, CFArrayGetCount (windows )),
- (CFComparatorFunction ) sortWindow,
- NULL);
- /* Sort the windows */
- NSInteger window_number;
- NSString* window_application_owner_name;
- NSInteger window_application_owner_pid;
- CGRect window_rectangle;
- printf ("Window Number Application Name Process ID X Y W H\n");
- printf ("-----------------------------------------------------------------------------\n");
- for ( NSDictionary* window in windows ){
- window_number = [[window objectForKey:(id ) kCGWindowNumber ] integerValue ];
- window_application_owner_name = [window objectForKey:(id ) kCGWindowOwnerName ];
- window_application_owner_pid = [[window objectForKey:(id ) kCGWindowOwnerPID ] integerValue ];
- CGRectMakeWithDictionaryRepresentation (CFDictionaryGetValue (window, kCGWindowBounds ),
- &window_rectangle );
- printf ("%-16d %-24s %-8d %-4.0f %6.0f %6.0f %6.0f\n",
- window_number,
- [window_application_owner_name UTF8String ],
- window_application_owner_pid,
- window_rectangle .origin .x,
- window_rectangle .origin .y,
- window_rectangle .size .width,
- window_rectangle .size .height); }
- [pool release]; }
- /*
- $ nano list_windows.m
- $ gcc -framework Cocoa list_windows.m
- $ ./a.out
- Output:
- Window Number Application Name Process ID X Y W H
- -----------------------------------------------------------------------------
- 2 Window Server 58 0 0 1366 768
- 6 Window Server 58 0 0 1366 22
- 11 Finder 121 0 0 1366 768
- 12 Window Server 58 0 22 1366 14
- 13 SystemUIServer 120 1320 0 46 22
- 14 SystemUIServer 120 1091 0 229 22
- 15 SystemUIServer 120 0 0 1366 22
- 17 Dock 119 0 22 1366 746
- 20 Dock 119 26 718 1314 50
- 26 Terminal 171 306 82 865 548
- */