Question: I need to enumerate all running applications. In particular, all top windows. And for every window I need to add my custom item to the system menu of that window.

How can I accomplish that in C++?

**Update.**

I would be more than happy to have a solution for Windows, MacOS, and Ubuntu (though, I'm not sure if MacOS and Ubuntu have such thing as 'system menu').

Answer: 
For Windows, another way to get the top-level windows (besides EnumWindows, which uses a callback) is to get the first child of the desktop and then retrieve all its siblings:

```
HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD);
while (wnd) {
    // handle 'wnd' here
    // ...
    wnd = GetNextWindow(wnd, GW_HWNDNEXT);
}

```

As for getting the *system* menu, use the [`GetSystemMenu`](http://msdn.microsoft.com/en-us/library/ms647985(VS.85).aspx) function, with FALSE as the second argument. The [`GetMenu`](http://msdn.microsoft.com/en-us/library/ms647640(VS.85).aspx) mentioned in the other answers returns the *normal* window menu.

Note, however, that while adding a custom menu item to a foreign process's window is easy, responding to the selection of that item is a bit tricky. You'll either have to inject some code to the process in order to be able to subclass the window, or install a global hook (probably a `WH_GETMESSAGE` or `WH_CBT` type) to monitor `WM_SYSCOMMAND` messages.
Once you have another window's top level handle, you may be able to call [GetMenu()](http://msdn.microsoft.com/en-us/library/ms647640(VS.85).aspx) to retrieve the Window's system menu and then modify it, eg:

```
HMENU hMenu = GetMenu(hwndNext);

```