Bladeren bron

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.
jp9000 8 jaren geleden
bovenliggende
commit
eb90b7dfff
1 gewijzigde bestanden met toevoegingen van 37 en 10 verwijderingen
  1. 37 10
      plugins/win-capture/window-helpers.c

+ 37 - 10
plugins/win-capture/window-helpers.c

@@ -255,8 +255,8 @@ HWND get_uwp_actual_window(HWND parent)
 	return NULL;
 	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) {
 	if (*parent) {
 		window = *parent;
 		window = *parent;
@@ -264,7 +264,12 @@ static inline HWND next_window(HWND window, enum window_search_mode mode,
 	}
 	}
 
 
 	while (true) {
 	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))
 		if (!window || check_window_valid(window, mode))
 			break;
 			break;
 	}
 	}
@@ -280,14 +285,32 @@ static inline HWND next_window(HWND window, enum window_search_mode mode,
 	return window;
 	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);
 	HWND window = FindWindowEx(GetDesktopWindow(), NULL, NULL, NULL);
 
 
+	if (!window) {
+		*use_findwindowex = false;
+		window = GetWindow(GetDesktopWindow(), GW_CHILD);
+	} else {
+		*use_findwindowex = true;
+	}
+
 	*parent = NULL;
 	*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)) {
 	if (is_uwp_window(window)) {
 		HWND child = get_uwp_actual_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)
 		add_window_cb callback)
 {
 {
 	HWND parent;
 	HWND parent;
-	HWND window = first_window(mode, &parent);
+	bool use_findwindowex = false;
+
+	HWND window = first_window(mode, &parent, &use_findwindowex);
 
 
 	while (window) {
 	while (window) {
 		add_window(p, window, callback);
 		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)
 		const char *exe)
 {
 {
 	HWND parent;
 	HWND parent;
-	HWND window      = first_window(mode, &parent);
+	bool use_findwindowex = false;
+
+	HWND window      = first_window(mode, &parent, &use_findwindowex);
 	HWND best_window = NULL;
 	HWND best_window = NULL;
 	int  best_rating = 0;
 	int  best_rating = 0;
 
 
@@ -383,7 +410,7 @@ HWND find_window(enum window_search_mode mode,
 			best_window = window;
 			best_window = window;
 		}
 		}
 
 
-		window = next_window(window, mode, &parent);
+		window = next_window(window, mode, &parent, use_findwindowex);
 	}
 	}
 
 
 	return best_window;
 	return best_window;