win-capture: Instantly capture already-hooked processes

If a process is already hooked, immediately initialize the capture
rather than wait for the processes to initialize or wait for the timer
to trigger.
This commit is contained in:
jp9000
2016-05-12 19:38:46 -07:00
parent 8681baeec3
commit 94e22dae49

View File

@@ -751,6 +751,33 @@ static bool init_hook(struct game_capture *gc)
return true;
}
static void setup_window(struct game_capture *gc, HWND window)
{
DWORD process_id = 0;
HANDLE hook_restart;
GetWindowThreadProcessId(window, &process_id);
/* do not wait if we're re-hooking a process */
hook_restart = open_event_id(EVENT_CAPTURE_RESTART, process_id);
if (hook_restart) {
gc->wait_for_target_startup = false;
CloseHandle(hook_restart);
}
/* otherwise if it's an unhooked process, always wait a bit for the
* target process to start up before starting the hook process;
* sometimes they have important modules to load first or other hooks
* (such as steam) need a little bit of time to load. ultimately this
* helps prevent crashes */
if (gc->wait_for_target_startup) {
gc->retry_interval = 3.0f;
gc->wait_for_target_startup = false;
} else {
gc->next_window = window;
}
}
static void get_fullscreen_window(struct game_capture *gc)
{
HWND window = GetForegroundWindow();
@@ -788,18 +815,7 @@ static void get_fullscreen_window(struct game_capture *gc)
rect.right == mi.rcMonitor.right &&
rect.bottom == mi.rcMonitor.bottom &&
rect.top == mi.rcMonitor.top) {
/* always wait a bit for the target process to start up before
* starting the hook process; sometimes they have important
* modules to load first or other hooks (such as steam) need a
* little bit of time to load. ultimately this helps prevent
* crashes */
if (gc->wait_for_target_startup) {
gc->retry_interval = 3.0f;
gc->wait_for_target_startup = false;
} else {
gc->next_window = window;
}
setup_window(gc, window);
} else {
gc->wait_for_target_startup = true;
}
@@ -807,17 +823,25 @@ static void get_fullscreen_window(struct game_capture *gc)
static void get_selected_window(struct game_capture *gc)
{
HWND window;
if (strcmpi(gc->config.class, "dwm") == 0) {
wchar_t class_w[512];
os_utf8_to_wcs(gc->config.class, 0, class_w, 512);
gc->next_window = FindWindowW(class_w, NULL);
window = FindWindowW(class_w, NULL);
} else {
gc->next_window = find_window(INCLUDE_MINIMIZED,
window = find_window(INCLUDE_MINIMIZED,
gc->config.priority,
gc->config.class,
gc->config.title,
gc->config.executable);
}
if (window) {
setup_window(gc, window);
} else {
gc->wait_for_target_startup = true;
}
}
static void try_hook(struct game_capture *gc)
@@ -1262,6 +1286,9 @@ static void game_capture_tick(void *data, float seconds)
gc->showing = false;
}
return;
} else if (!gc->showing) {
gc->retry_time = 10.0f;
}
if (gc->hook_stop && object_signalled(gc->hook_stop)) {