private void FindRa3Process()
        {
            var ra3Procs = Process.GetProcessesByName(Constants.Ra3ProcessName);

            if (ra3Procs.Length <= 0)
            {
                Logger.Debug("RA3 *not* found at startup.");
                return;
            }

            if (Pinvokes.IsWindow(ra3Procs[0].MainWindowHandle))
            {
                Logger.Debug("RA3 found at startup.");
                LatestRa3 = ra3Procs[0];
                return;
            }

            Task.Delay(1000).ContinueWith(_ =>
            {
                Logger.Debug("RA3 found but no window yet. Retry.");
                FindRa3Process();
            });
        }
        private void ProcessWatcherOnProcessStarted(object sender, ProcessArgs e)
        {
            Console.WriteLine($"[{e.Process.ProcessName}] LAUNCHED");

            if (e.Process.ProcessName != Constants.Ra3ProcessName)
            {
                return;
            }

            Logger.Debug($"Found ra3 process - Has Window: {Pinvokes.IsWindow(e.Process.MainWindowHandle)}");

            // Right after process creation, ra3 doesnt have a window and it can be assumed that the process is not fully loaded.
            // This is a workaround which will probably remain here forever :/
            if (!Pinvokes.IsWindow(e.Process.MainWindowHandle))
            {
                Task.Delay(1000).ContinueWith(_ => { ProcessWatcherOnProcessStarted(sender, e); });
                return;
            }

            if (LatestRa3 == null || LatestRa3.HasExited)
            {
                LatestRa3 = e.Process;
            }
        }