private async Task StartTableAsync(int mainThread) { logger.Info($"{RunMode.ToString()}: Starting table: {CurrentTable.Name}"); RunMode = Mode.SystemRunning; logger.Trace($"Setting Mode to {RunMode.ToString()}"); //Play Launch Music LMusicPlayer.Open(CurrentTable.LMusic); LMusicPlayer.Play(); var system = Data.FindSystem(CurrentTable); // get system to launch var proc = PinballFunctions.StartTable(system, CurrentTable); // launch system Stopwatch watchdog = new Stopwatch(); watchdog.Reset(); watchdog.Start(); //Wait for process to start (done this way for steam games) logger.Info($"Starting Game Process, Name: {system.Name}"); //proc.WaitForInputIdle(); await Task.Run(() => { while (Process.GetProcessesByName(system.Name).Length <= 0) { ; } }); var game = Process.GetProcessesByName(system.Name).First(); logger.Info($"Game Process Found, Handle: {game.Id}"); //keep hiding while window is starting await Task.Run(() => { do { //WindowControl.HideAllProcessWindows(system.Name, true); } while (WindowControl.FindProcessWindow(system.Name, system.WindowName) == IntPtr.Zero); //WindowControl.HideAllProcessWindows(system.Name); }); var windowHandle = WindowControl.FindProcessWindow(system.Name, system.WindowName); WindowControl.HideWindow(windowHandle, true); logger.Info($"Game Window Found, Process: {system.Name}, Name: {system.WindowName}, Handle: {windowHandle}"); //Try and Mute System watchdog.Restart(); logger.Info("Muting System"); await Task.Run(() => { while (VolumeMixer.GetApplicationMute(game.Id) != true) { //Console.WriteLine("Trying to Mute"); VolumeMixer.SetApplicationMute(game.Id, true); //WindowControl.SetFocus(ProgramName); if (watchdog.ElapsedMilliseconds > 10000) { logger.Warn($"Can't Mute System, Process ID: {game.Id}"); break; } } }); //Wait for Game to load await Task.Run(() => Task.Delay(system.WaitTime * 1000)); BGMusicPlayer.Pause(); //Unmute watchdog.Restart(); logger.Info("Unmuting System"); while (VolumeMixer.GetApplicationMute(game.Id) != false) { //Console.WriteLine("Trying to Unmute"); VolumeMixer.SetApplicationMute(game.Id, false); //WindowControl.SetFocus(ProgramName); if (watchdog.ElapsedMilliseconds > 10000) { logger.Warn($"Can't Unmute System, Process ID: {game.Id}"); break; } } //Show Game Window WindowControl.ShowWindow(windowHandle, true); //Focus GAME WindowControl.SetFocusForeground(windowHandle, true); //Hide Selected Windows logger.Trace("Setting Window Visibility"); BackglassWindow.Visibility = CurrentTable.ShowBackglass ? Visibility.Visible : Visibility.Hidden; DMDWindow.Visibility = CurrentTable.ShowDMD ? Visibility.Visible : Visibility.Hidden; PlayfieldVisibility = Visibility.Hidden; }
private void StartTable(object obj) { PinballFunctions.StartTable(Data.FindSystem(SelectedTable), SelectedTable); }