win-capture: Add support for finding windows via EnumWindows

The top-level window appears to be preferred for upcoming Windows
Graphics Capture support, at least for UWP apps.
master
jpark37 2019-11-27 16:42:49 -08:00 committed by jp9000
parent 9cff2ae6bb
commit d4ca08c4c7
2 changed files with 53 additions and 0 deletions

View File

@ -424,3 +424,52 @@ HWND find_window(enum window_search_mode mode, enum window_priority priority,
return best_window;
}
struct top_level_enum_data {
enum window_search_mode mode;
enum window_priority priority;
const char *class;
const char *title;
const char *exe;
bool uwp_window;
HWND best_window;
int best_rating;
};
BOOL CALLBACK enum_windows_proc(HWND window, LPARAM lParam)
{
struct top_level_enum_data *data = (struct top_level_enum_data *)lParam;
if (!check_window_valid(window, data->mode))
return TRUE;
const int rating = window_rating(window, data->priority, data->class,
data->title, data->exe,
data->uwp_window);
if (rating < data->best_rating) {
data->best_rating = rating;
data->best_window = window;
}
return rating > 0;
}
HWND find_window_top_level(enum window_search_mode mode,
enum window_priority priority, const char *class,
const char *title, const char *exe)
{
if (!class)
return NULL;
struct top_level_enum_data data;
data.mode = mode;
data.priority = priority;
data.class = class;
data.title = title;
data.exe = exe;
data.uwp_window = strcmp(class, "Windows.UI.Core.CoreWindow") == 0;
data.best_window = NULL;
data.best_rating = 0x7FFFFFFF;
EnumWindows(enum_windows_proc, (LPARAM)&data);
return data.best_window;
}

View File

@ -31,3 +31,7 @@ extern void build_window_strings(const char *str, char **class, char **title,
extern HWND find_window(enum window_search_mode mode,
enum window_priority priority, const char *class,
const char *title, const char *exe);
extern HWND find_window_top_level(enum window_search_mode mode,
enum window_priority priority,
const char *class, const char *title,
const char *exe);