コード例 #1
0
        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;
        }
コード例 #2
0
 private void StartTable(object obj)
 {
     PinballFunctions.StartTable(Data.FindSystem(SelectedTable), SelectedTable);
 }