A window is just a place, where an application can do its drawing, like drawing a button, text or other stuff.
Table of Contents
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 */