From eb90b7dffffaf6adda31723b2de0c9f3a664f45f Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 21 Feb 2017 00:37:50 -0800 Subject: [PATCH] win-capture: Fall back to GetWindow if FindWindowEx fails When kaspersky is installed on windows 7, FindWindowEx will fail to find any windows due to apparently being blocked by kaspersky, so detect when that happens, and fall back to GetWindow instead if it does. --- plugins/win-capture/window-helpers.c | 47 ++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 10 deletions(-) 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;