diff --git a/plugins/win-capture/window-helpers.c b/plugins/win-capture/window-helpers.c index c5bf3657c..4da089854 100644 --- a/plugins/win-capture/window-helpers.c +++ b/plugins/win-capture/window-helpers.c @@ -255,8 +255,8 @@ HWND get_uwp_actual_window(HWND parent) return NULL; } -static inline HWND next_window(HWND window, enum window_search_mode mode, - HWND *parent) +static HWND next_window(HWND window, enum window_search_mode mode, + HWND *parent, bool use_findwindowex) { if (*parent) { window = *parent; @@ -264,7 +264,12 @@ static inline HWND next_window(HWND window, enum window_search_mode mode, } while (true) { - window = FindWindowEx(GetDesktopWindow(), window, NULL, NULL); + if (use_findwindowex) + window = FindWindowEx(GetDesktopWindow(), window, NULL, + NULL); + else + window = GetNextWindow(window, GW_HWNDNEXT); + if (!window || check_window_valid(window, mode)) break; } @@ -280,14 +285,32 @@ static inline HWND next_window(HWND window, enum window_search_mode mode, return window; } -static inline HWND first_window(enum window_search_mode mode, HWND *parent) +static HWND first_window(enum window_search_mode mode, HWND *parent, + bool *use_findwindowex) { HWND window = FindWindowEx(GetDesktopWindow(), NULL, NULL, NULL); + if (!window) { + *use_findwindowex = false; + window = GetWindow(GetDesktopWindow(), GW_CHILD); + } else { + *use_findwindowex = true; + } + *parent = NULL; - if (!check_window_valid(window, mode)) - window = next_window(window, mode, parent); + if (!check_window_valid(window, mode)) { + window = next_window(window, mode, parent, *use_findwindowex); + + if (!window && *use_findwindowex) { + *use_findwindowex = false; + + window = GetWindow(GetDesktopWindow(), GW_CHILD); + if (!check_window_valid(window, mode)) + window = next_window(window, mode, parent, + *use_findwindowex); + } + } if (is_uwp_window(window)) { HWND child = get_uwp_actual_window(window); @@ -304,11 +327,13 @@ void fill_window_list(obs_property_t *p, enum window_search_mode mode, add_window_cb callback) { HWND parent; - HWND window = first_window(mode, &parent); + bool use_findwindowex = false; + + HWND window = first_window(mode, &parent, &use_findwindowex); while (window) { add_window(p, window, callback); - window = next_window(window, mode, &parent); + window = next_window(window, mode, &parent, use_findwindowex); } } @@ -366,7 +391,9 @@ HWND find_window(enum window_search_mode mode, const char *exe) { HWND parent; - HWND window = first_window(mode, &parent); + bool use_findwindowex = false; + + HWND window = first_window(mode, &parent, &use_findwindowex); HWND best_window = NULL; int best_rating = 0; @@ -383,7 +410,7 @@ HWND find_window(enum window_search_mode mode, best_window = window; } - window = next_window(window, mode, &parent); + window = next_window(window, mode, &parent, use_findwindowex); } return best_window;