public static IDictionary<IntPtr, string> GetOpenWindows() {
var shellWindow = User32.GetShellWindow();
var windows = new Dictionary<IntPtr, string>();
User32.EnumWindows(delegate (IntPtr hWnd, int lParam) {
if (hWnd == shellWindow) return true;
if (!User32.IsWindowVisible(hWnd)) return true;
var length = User32.GetWindowTextLength(hWnd);
if (length == 0) return true;
var builder = new StringBuilder(length);
User32.GetWindowText(hWnd, builder, length + 1);
windows[hWnd] = builder.ToString();
return true;
}, 0);
return windows;
}
}