Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 924449
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T19:21:20+00:00 2026-05-15T19:21:20+00:00

(by all mean do re-tag with the relevant technology: I don’t know which ones

  • 0

(by all mean do re-tag with the relevant technology: I don’t know which ones they are 🙂

I’ll probably come later with more detailed questions, about specific details but for now I’m trying to grasp the “big picture”: I’m looking for a way to enumerate “real visible windows” on Windows. By “real visible window” I mean just that: what a user would call a “window”. I need a way to get a list of all these visible windows, in Z-order.

Note that I do really need to do that. I’ve already done it on OS X (where it is a real headache to do, especially if you want to support OS X 10.4, because OS X doesn’t have convenient windows API) and now I need to do it under Windows.

Here’s an example, suppose there are three visible windows on the screen, like this:

 +------------------------------------------+
 |                                          |
 |           +=============+                |
 |           |             |                |
 |           |    A   +--------------------------+
 |           |        |                          |
 |    C      |        |             B            |
 |           |        +--------------------------+
 |           |             |                |
 +-----------|             |----------------+
             |             |
             +-------------+

Then I need to get back a list like this:

 windows B is at (210,40)
 windows A is at (120,20)
 windows C is at (0,0)

Then if the user (or the OS) brings the window A to the front, it becomes:

 +------------------------------------------+
 |                                          |
 |           +=============+                |
 |           |             |                |
 |           |    A        |---------------------+
 |           |             |                     |
 |    C      |             |        B            |
 |           |             |---------------------+
 |           |             |                |
 +-----------|             |----------------+
             |             |
             +-------------+

And I get (ideally) a callback giving me this:

windows A is at (120,20)
windows B is at (210,40)
windows C is at (0,0)

Doing this under OS X requires the use of amazingly weird hacks (like mandating the user to turn on “Enable Access for assistive device”!) but I’ve done it under OS X and it works (under OS X, I didn’t manage to get a callback everytime some window changes occurs, so I’m polling, but I got it to work).

Now I want to do this under Windows (I really do, no question about it) and I’ve got a few questions:

  • can this be done?

  • are there well documented Windows APIs (and working as per their specs) allowing to do that?

  • is it easy to register a callback everytime a window changes? (if it is resized, moved, brought to back/front or if a new window pops-up, etc.)

  • what would the gotchas be?

I know this question is not specific, which is why I’ve tried to describe my problem as clearly as possible (including nice ASCII art for which you can upvote this): for now I’m looking at the “big picture”. I want to know what doing such a thing involves under Windows.

Bonus question: imagine you’d need to write a tiny .exe writing the windows names/position/size to a temporary file everytime there’s a window change on screen, how long would such a program be approximately in your language of choice and how long would you need to write it?

(once again, I’m trying to get the “big picture” to understand what is at work here)

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T19:21:20+00:00Added an answer on May 15, 2026 at 7:21 pm

    To enumerate the top-level windows, you should use EnumWindows rather than GetTopWindow/GetNextWindow, since EnumWindows returns a consistent view of the window state. You risk getting inconsistent information (such as reporting on deleted windows) or infinite loops using GetTopWindow/GetNextWindow, when windows change z-order during iteration.

    The EnumWindows uses a callback. On each call of the callback you get a window handle. The screen co-ordinates of the window can be fetched by passing that handle to GetWindowRect. Your callback builds a list of the window positions in z-order.

    You can use polling, and build the window list repeatedly. Or, you set up a CBTHook to receive notifications of window changes. Not all CBT notifications will result in changes to order,position or visibility of top level windows, so it’s wise to rerun EnmWindows to build a new list of window positions in z-order and compare this to the previous list before processing the list further, so that futher processing is done only when a real change has occurred.

    Note that with hooking, you cannot mix 32- and 64-bit. If you are running a 32-bit app, then you will get notifications from 32-bit processes. Similarly for 64-bit. Thus, if you want to monitor the entire system on a 64-bit machine, it would seem that it’s necessary to run two apps. My reasoning comes from reading this:

    SetWindowsHookEx can be used to inject
    a DLL into another process. A 32-bit
    DLL cannot be injected into a 64-bit
    process, and a 64-bit DLL cannot be
    injected into a 32-bit process. If an
    application requires the use of hooks
    in other processes, it is required
    that a 32-bit application call
    SetWindowsHookEx to inject a 32-bit
    DLL into 32-bit processes, and a
    64-bit application call
    SetWindowsHookEx to inject a 64-bit
    DLL into 64-bit processes. The 32-bit
    and 64-bit DLLs must have different
    names.
    (From the SetWindowsHookEx api page.)

    As you’re implementing this in Java, you might want to look at JNA – it makes writing access to native libraries much simpler (calling code in java) and removes the need for your own native JNI DLL.

    EDIT: You asked how much code it is and how long to write. Here’s the code in java

    import com.sun.jna.Native;
    import com.sun.jna.Structure;
    import com.sun.jna.win32.StdCallLibrary;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class Main {
    
        public static void main(String[] args) {
            Main m = new Main();
            final List<WindowInfo> inflList = new ArrayList<WindowInfo>();
            final List<Integer> order = new ArrayList<Integer>();
            int top = User32.instance.GetTopWindow(0);
            while (top != 0) {
                order.add(top);
                top = User32.instance.GetWindow(top, User32.GW_HWNDNEXT);
            }
    
            User32.instance.EnumWindows(new WndEnumProc() {
                public boolean callback(int hWnd, int lParam) {
                    if (User32.instance.IsWindowVisible(hWnd)) {
                        RECT r = new RECT();
                        User32.instance.GetWindowRect(hWnd, r);
                        if (r.left > -32000) {     // If it's not minimized
                            byte[] buffer = new byte[1024];
                            User32.instance.GetWindowTextA(hWnd, buffer, buffer.length);
                            String title = Native.toString(buffer);
                            inflList.add(new WindowInfo(hWnd, r, title));
                        }
                    }
                    return true;
                }
            }, 0);
    
            Collections.sort(inflList, new Comparator<WindowInfo>() {
                public int compare(WindowInfo o1, WindowInfo o2) {
                    return order.indexOf(o1.hwnd)-order.indexOf(o2.hwnd);
                }
            });
            for (WindowInfo w : inflList) {
                System.out.println(w);
            }
        }
    
        public static interface WndEnumProc extends StdCallLibrary.StdCallCallback {
            boolean callback(int hWnd, int lParam);
        }
    
        public static interface User32 extends StdCallLibrary {
            final User32 instance = (User32) Native.loadLibrary ("user32", User32.class);
            final int GW_HWNDNEXT = 2;
    
            boolean EnumWindows(WndEnumProc wndenumproc, int lParam);
            boolean IsWindowVisible(int hWnd);
            int GetWindowRect(int hWnd, RECT r);
            void GetWindowTextA(int hWnd, byte[] buffer, int buflen);
            int GetTopWindow(int hWnd);
            int GetWindow(int hWnd, int flag);
        }
    
        public static class RECT extends Structure {
            public int left, top, right, bottom;
        }
    
        public static class WindowInfo {
            public final int hwnd;
            public final RECT rect;
            public final String title;
            public WindowInfo(int hwnd, RECT rect, String title) {
                this.hwnd = hwnd;
                this.rect = rect;
                this.title = title;
            }
    
            public String toString() {
                return String.format("(%d,%d)-(%d,%d) : \"%s\"",
                    rect.left, rect.top,
                    rect.right, rect.bottom,
                    title);
            }
        }
    }
    

    I’ve made most of the related classes and interfaces inner classes to keep the example compact and pasteable for immediate compilation. In a real implementation, they would be regular top-level classes. The command line app prints out the visible windows and their position. I ran it on both 32-bit jvm and 64-bit, and got the same results for each.

    EDIT2: Updated code to include z-order. It does use GetNextWindow. In a production application, you should probably call GetNextWindow twice for the next and previous values and check they are consistent and are valid window handles.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Do all voice-to-text algorithms of current technology operate in real-time? I don't mean with
I know its simple but: fieldset label.inline does mean that all labls with the
WPF validation system performs intial validatation of an object (I mean - all fields
All front-end developers know the pain of coding for Firefox, then viewing our then
All I know about the constraint is it's name ( SYS_C003415 ), but I
First of all this is more of a math question than it is a
Is there a way I can convert ALL characters, including regular ones, using PHP
All the articles I've found via google are either obsolete or contradict one another.
All the recent VisualSVN Server posts made me want to check it out. I
All I want is to be able to change the color of a bullet

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.