//private bool _UseSingleMouse = true;

        public DemulShooterWindow(string[] Args, bool isVerbose)
        {
            //Stop program if Demulshooter already running
            Process[] pDemulShooter = Process.GetProcessesByName("DemulShooter");
            if (pDemulShooter.Length > 1)
            {
                MessageBox.Show("Another instance of DemulShooter is already running.\nPlease terminate it before launching a new one", "DemulShooter", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(0);
            }

            //Creating TrayIcon and TrayIcon "Exit" menu
            Application.ApplicationExit += new EventHandler(OnApplicationExit);
            InitializeComponent();

            Logger.IsEnabled = isVerbose;
            Logger.InitLogFileName();
            Logger.WriteLog("");
            Logger.WriteLog("---------------- Program Start -- DemulShooter v" + System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString() + " ----------------");

            // Parsing commandline arguments
            for (int i = 0; i < Args.Length; i++)
            {
                Logger.WriteLog("Cmdline arg " + i + " : " + Args[i]);
                if (Args[i].ToLower().StartsWith("-ddinumber"))
                {
                    try
                    {
                        //-1 to transform to a 0-based index for later calculation
                        _Ddinumber = UInt32.Parse((Args[i].Split('='))[1].Trim()) - 1;
                    }
                    catch
                    {
                        Logger.WriteLog("-ddinumber parameter not good, it will keep default value");
                    }
                }
                else if (Args[i].ToLower().Equals("-hardffl"))
                {
                    _HardFfl = true;
                }
                else if (Args[i].ToLower().StartsWith("-forcexratio"))
                {
                    String sX = (Args[i].Split('='))[1].Trim();
                    try
                    {
                        if (sX.Contains("/") && sX.Split('/').Length > 1)
                        {
                            double d1 = Double.Parse(sX.Split('/')[0]);
                            double d2 = Double.Parse(sX.Split('/')[1]);
                            _ForceXratio = d1 / d2;
                        }
                        else
                        {
                            _ForceXratio = Double.Parse(sX, CultureInfo.InvariantCulture);
                        }
                    }
                    catch
                    {
                        Logger.WriteLog("Can't set -ForcedXratio option : " + sX + " is not a valid value");
                    }
                }
                else if (Args[i].ToLower().Equals("-nocrosshair"))
                {
                    _HideGameCrosshair = true;
                }
                else if (Args[i].ToLower().Equals("-noautoreload"))
                {
                    _NoAutoReload = true;
                }
                else if (Args[i].ToLower().Equals("-noautofire"))
                {
                    _NoAutoFire = true;
                }
                if (Args[i].ToLower().Equals("-noinput"))
                {
                    _NoInput = true;
                }
                else if (Args[i].ToLower().Equals("-noguns"))
                {
                    _NoGuns = true;
                }
                else if (Args[i].ToLower().Equals("-noresize"))
                {
                    _DisableWindow = true;
                }
                if (Args[i].ToLower().StartsWith("-rom"))
                {
                    _Rom = (Args[i].Split('='))[1].Trim();
                }
                else if (Args[i].ToLower().StartsWith("-target"))
                {
                    _Target = (Args[i].Split('='))[1].Trim();
                    if (_Target.StartsWith("demul"))
                    {
                        _DemulVersion = _Target.Substring(5, 3);
                    }
                }
                else if (Args[i].ToLower().Equals("-widescreen"))
                {
                    _WidescreenHack = true;
                }
            }
            if (_TrayIcon != null)
            {
                _TrayIcon.Text += "[" + _Target + "] [" + _Rom + "]";
            }

            //Finding plugged devices
            _AvailableControllers = RawInputHelper.GetRawInputDevices(new RawInputDeviceType[] { RawInputDeviceType.RIM_TYPEHID, RawInputDeviceType.RIM_TYPEMOUSE });
            Logger.WriteLog("Found " + _AvailableControllers.Length + " available RawInput devices :");
            foreach (RawInputController c in _AvailableControllers)
            {
                try
                {
                    Logger.WriteLog(" + [" + c.DeviceType.ToString() + "] " + c.DeviceName);
                }
                catch (Exception ex)
                {
                    Logger.WriteLog("ERROR : " + ex.Message.ToString());
                }
            }

            //Reading config file to get parameters
            _Configurator = new Configurator();
            _Configurator.ReadDsConfig(AppDomain.CurrentDomain.BaseDirectory + @"\" + DEMULSHOOTER_CONF_FILENAME);
            foreach (PlayerSettings Player in _Configurator.PlayersSettings)
            {
                Logger.WriteLog("P" + Player.ID + " mode = " + Player.Mode);
                if (Player.Mode == PlayerSettings.PLAYER_MODE_RAWINPUT)
                {
                    bool bControllerfound = false;
                    Logger.WriteLog("P" + Player.ID + " device = " + Player.DeviceName);
                    foreach (RawInputController Controller in _AvailableControllers)
                    {
                        //Usually , the device name never change and it's easy to find back a controller
                        if (Controller.DeviceName == Player.DeviceName)
                        {
                            Player.RIController = Controller;
                            Player.RIController.Selected_AxisX = Player.HidAxisX;
                            Player.RIController.Selected_AxisY = Player.HidAxisY;
                            Player.RIController.Selected_OnScreenTriggerButton  = Player.HidButton_OnScreenTrigger;
                            Player.RIController.Selected_ActionButton           = Player.HidButton_Action;
                            Player.RIController.Selected_OffScreenTriggerButton = Player.HidButton_OffScreenTrigger;
                            Logger.WriteLog("P" + Player.ID + " device plugged and found, Handle = 0x" + Controller.DeviceHandle);
                            Logger.WriteLog("P" + Player.ID + " device : " + Controller.ManufacturerName + " / " + Controller.ProductName);
                            bControllerfound = true;
                            break;
                        }
                    }

                    //Unfortunatelly, on a few cases (SONY DS4 for example), a part of the device name changes so we will check again
                    //with what seems to be a fixed part of the name
                    if (!bControllerfound)
                    {
                        /*foreach (RawInputController Controller in _AvailableControllers)
                         * {
                         *  //Usually , the device name never change and it's easy to find back a controller
                         *  if (Controller.DeviceName == Player.DeviceName)
                         *  {
                         *      Player.RIController = Controller;
                         *      Player.RIController.Set_AxisX(Player.HidAxisX);
                         *      Player.RIController.Set_AxisY(Player.HidAxisY);
                         *      Player.RIController.Set_Button_OnScreenTrigger_Index(Player.HidButton_OnScreenTrigger_Index);
                         *      Player.RIController.Set_Button_Action_Index(Player.HidButton_Action_Index);
                         *      Player.RIController.Set_Button_OffScreenTrigger_Index(Player.HidButton_OffScreenTrigger_Index);
                         *      Logger.WriteLog("P" + Player.ID + " device plugged and found, Handle = 0x" + Controller.DeviceHandle);
                         *      Logger.WriteLog("P" + Player.ID + " device : " + Controller.ProductName + " / " + Controller.DeviceName);
                         *      bControllerfound = true;
                         *      break;
                         *  }
                         * }*/
                    }
                }
                else
                {
                    Logger.WriteLog("P" + Player.ID + " Gamepad ID = " + Player.GamepadID);
                }
            }

            //Info on Monitor (max resolution)
            var    scope  = new System.Management.ManagementScope();
            var    q      = new System.Management.ObjectQuery("SELECT * FROM CIM_VideoControllerResolution");
            String Maxres = String.Empty;

            using (var searcher = new System.Management.ManagementObjectSearcher(scope, q))
            {
                var results = searcher.Get();
                foreach (var item in results)
                {
                    Maxres = item["Caption"].ToString();
                }
            }
            Logger.WriteLog("Monitor maximum resolution = " + Maxres);

            CreateRawMessageWindow();
            //Register to RawInput thanks to the previously created window Handle
            RawInputDevice[] rid = new RawInputDevice[3];
            rid[0].UsagePage  = HidUsagePage.GENERIC;
            rid[0].Usage      = HidUsage.Joystick;
            rid[0].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[0].hwndTarget = _RawMessageWnd_hWnd;

            rid[1].UsagePage  = HidUsagePage.GENERIC;
            rid[1].Usage      = HidUsage.Mouse;
            rid[1].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[1].hwndTarget = _RawMessageWnd_hWnd;

            rid[2].UsagePage  = HidUsagePage.GENERIC;
            rid[2].Usage      = HidUsage.Gamepad;
            rid[2].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[2].hwndTarget = _RawMessageWnd_hWnd;
            if (!Win32API.RegisterRawInputDevices(rid, (uint)rid.Length, (uint)Marshal.SizeOf(rid[0])))
            {
                MessageBox.Show("Failed to register raw input device(s).", "DemulShooter Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

            //Starting Mame-style output daemon
            if (_Configurator.OutputEnabled)
            {
                Logger.WriteLog("Starting Output daemon...");
                _OutputHelper = new MameOutputHelper(_RawMessageWnd_hWnd, _Configurator.OutputCustomRecoilOnDelay, _Configurator.OutputCustomRecoilOffDelay, _Configurator.OutputCustomDamagedDelay);
                _OutputHelper.Start();
                _OutputUpdateLoop = new Thread(new ThreadStart(ReadAndSendOutput_Thread));
                _OutputUpdateLoop.Start();
            }

            //Starting the fun...
            if (_Target.Length > 0 && (_Rom.Length > 0 || _Target.StartsWith("dolphin")))
            {
                //Install Low-Level mouse hook
                ApplyMouseHook();

                //Install Low Level keyboard hook
                ApplyKeyboardHook();

                /*
                 * //Running Xinput daemon if needed
                 * bool EnableXInputProc = false;
                 * foreach (ControllerDevice Device in _ControllerDevices)
                 * {
                 *  if (Device.GamepadID != -1)
                 *  {
                 *      EnableXInputProc = true;
                 *      break;
                 *  }
                 * }
                 * if (EnableXInputProc)
                 *  Bgw_XInput.RunWorkerAsync();
                 */

                if (_Target.Equals("chihiro"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "vcop3":
                    {
                        _Game = new Game_CxbxVcop3(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    }; break;
                    }
                }

                //Demul games
                else if (_Target.StartsWith("demul"))
                {
                    if (_Rom.ToLower().Equals("confmiss") || _Rom.ToLower().Equals("deathcox") || _Rom.ToLower().StartsWith("hotd2") ||
                        _Rom.ToLower().Equals("lupinsho") || _Rom.ToLower().Equals("mok"))
                    {
                        _Game = new Game_DemulNaomi(_Rom.ToLower(), _DemulVersion, _ForceXratio, _NoInput, isVerbose, _DisableWindow, _WidescreenHack);
                    }
                    else if (_Rom.ToLower().StartsWith("ninjaslt"))
                    {
                        _Game = new Game_DemulJvs(_Rom.ToLower(), _DemulVersion, _ForceXratio, _NoInput, isVerbose, _DisableWindow, _WidescreenHack);
                    }
                    else if (_Rom.ToLower().Equals("braveff"))
                    {
                        _Game = new Game_DemulHikaru(_Rom.ToLower(), _DemulVersion, _ForceXratio, _NoInput, isVerbose, _DisableWindow, _WidescreenHack);
                    }
                    else if (_Rom.ToLower().Equals("manicpnc") || _Rom.ToLower().Equals("pokasuka"))
                    {
                        _Game = new Game_DemulManicpnc(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose, _DisableWindow, _WidescreenHack);
                    }
                    else
                    {
                        _Game = new Game_DemulAtomiswave(_Rom.ToLower(), _DemulVersion, _ForceXratio, _NoInput, isVerbose, _DisableWindow, _WidescreenHack);
                    }
                }

                //Dolphin
                else if (_Target.Equals("dolphin5"))
                {
                    _Game = new Game_Dolphin5(_Rom.ToLower(), _Ddinumber, _Configurator.DIK_Dolphin_P2_LClick, _Configurator.DIK_Dolphin_P2_MClick, _Configurator.DIK_Dolphin_P2_RClick, _ForceXratio, _NoInput, isVerbose);
                }

                //GlobalVR game
                else if (_Target.Equals("globalvr"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "aliens":
                    {
                        _Game = new Game_GvrAliens(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "farcry":
                    {
                        _Game = new Game_GvrFarCryV2(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "fearland":
                    {
                        _Game = new Game_GvrFearLand(_Rom.ToLower(), _HardFfl, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    default:
                        break;
                    }
                }

                //Lindbergh
                else if (_Target.Equals("lindbergh"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "2spicy":
                    {
                        _Game = new Game_Lindbergh2spicy(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "hotd4":
                    {
                        _Game = new Game_LindberghHotd4(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "lgj":
                    {
                        _Game = new Game_LindberghLgj(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "lgjsp":
                    {
                        _Game = new Game_LindberghLgjsp(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "rambo":
                    {
                        _Game = new Game_LindberghRambo(_Rom.ToLower(), _HideGameCrosshair, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    default:
                        break;
                    }
                }

                //All model2 roms share same method
                else if (_Target.Equals("model2"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "bel":
                    {
                        _Game = new Game_Model2Bel(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "gunblade":
                    {
                        _Game = new Game_Model2Gunblade(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "hotd":
                    {
                        _Game = new Game_Model2Hotd(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "rchase2":
                    {
                        _Game = new Game_Model2Rchase2(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "vcop":
                    {
                        _Game = new Game_Model2Vcop(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "vcop2":
                    {
                        _Game = new Game_Model2Vcop2(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    default:
                        break;
                    }
                }

                //Ring system
                else if (_Target.Equals("ringwide"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "sgg":
                    {
                        _Game = new Game_RwSGG(_Rom.ToLower(), _NoAutoFire, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "lgi":
                    {
                        _Game = new Game_RwLGI(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "lgi3d":
                    {
                        _Game = new Game_RwLGI3D(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "og":
                    {
                        _Game = new Game_RwOpGhost(_Rom.ToLower(), _Configurator.OpGhost_EnableFreeplay, _Configurator.OpGhost_CreditsToStart, _Configurator.OpGhost_CreditsToContinue, _Configurator.OpGhost_CoinsByCredits, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "sdr":
                    {
                        _Game = new Game_RwSDR(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    }; break;

                    case "tha":
                    {
                        _Game = new Game_RwTransformers(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    }; break;

                    default:
                        break;
                    }
                }

                //TTX game
                else if (_Target.Equals("ttx"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "bkbs":
                    {
                        _Game = new Game_TtxBlockKingBallShooter(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "eadp":
                    {
                        _Game = new Game_TtxEadp(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "gattack4":
                    {
                        _Game = new Game_TtxGaiaAttack4(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "gsoz":
                    {
                        _Game = new Game_TtxGundam(_Rom.ToLower(), _Configurator.Gsoz_Pedal_P1_Enabled, _Configurator.DIK_Gsoz_Pedal_P1, _Configurator.Gsoz_Pedal_P2_Enabled, _Configurator.DIK_Gsoz_Pedal_P2, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "gsoz2p":
                    {
                        _Game = new Game_TtxGundam(_Rom.ToLower(), _Configurator.Gsoz_Pedal_P1_Enabled, _Configurator.DIK_Gsoz_Pedal_P1, _Configurator.Gsoz_Pedal_P2_Enabled, _Configurator.DIK_Gsoz_Pedal_P2, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "hmuseum":
                    {
                        _Game = new Game_TtxHauntedMuseum(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "hmuseum2":
                    {
                        _Game = new Game_TtxHauntedMuseum2(_Rom.ToLower(), _HardFfl, _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "mgungun2":
                    {
                        _Game = new Game_TtxGungun2(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "sha":
                    {
                        _Game = new Game_TtxSha(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;
                    }
                }

                //Windows Games
                else if (_Target.Equals("windows"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "artdead":
                    {
                        _Game = new Game_WndArtIsDead(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "friction":
                    {
                        _Game = new Game_WndFriction(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;

                    case "hfa":
                    {
                        _Game = new Game_WndHeavyFire3Pc("hfa", _Configurator.HF3_Path, _Configurator.HF3_CoverSensibility, _NoInput, false, isVerbose);
                    }; break;

                    case "hfa2p":
                    {
                        _Game = new Game_WndHeavyFire3Pc("hfa", _Configurator.HF3_Path, _Configurator.HF3_CoverSensibility, _NoInput, true, isVerbose);
                    }; break;

                    case "hfss":
                    {
                        _Game = new Game_WndHeavyFire4Pc("hfss", _Configurator.HF4_Path, _Configurator.HF4_CoverSensibility, _NoInput, false, isVerbose);
                    }; break;

                    case "hfss2p":
                    {
                        _Game = new Game_WndHeavyFire4Pc("hfss", _Configurator.HF4_Path, _Configurator.HF4_CoverSensibility, _NoInput, true, isVerbose);
                    }; break;

                    case "hod2pc":
                    {
                        _Game = new Game_WndHod2pc(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    }; break;

                    case "hod3pc":
                    {
                        _Game = new Game_WndHod3pc(_Rom.ToLower(), _NoAutoReload, _NoGuns, _ForceXratio, _NoInput, isVerbose);
                    }; break;

                    case "hodo":
                    {
                        _Game = new Game_WndHotdoPc(_Rom.ToLower(), _NoInput, isVerbose);
                    }; break;

                    case "reload":
                    {
                        _Game = new Game_WndReload(_Rom.ToLower(), _HideGameCrosshair, _NoInput, isVerbose);
                    }; break;
                    }
                }

                //W.I.P Games
                else if (_Target.Equals("wip"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "wartran":
                    {
                        _Game = new Game_WndWartran(_Rom.ToLower(), _ForceXratio, _NoInput, isVerbose);
                    } break;
                    }
                }

                _Game.OnGameHooked += new Game.GameHookedHandler(OnGameHooked);
            }
        }
Exemple #2
0
        public DemulShooterWindowX64(string[] Args, bool isVerbose)
        {
            _This = this;

            //Stop program if Demulshooter already running
            Process[] pDemulShooter = Process.GetProcessesByName("DemulShooterX64");
            if (pDemulShooter.Length > 1)
            {
                MessageBox.Show("Another instance of DemulShooterX64 is already running.\nPlease terminate it before launching a new one", "DemulShooterX64", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(0);
            }

            //Creating TrayIcon and TrayIcon "Exit" menu
            Application.ApplicationExit += new EventHandler(OnApplicationExit);
            InitializeComponent();

            Logger.IsEnabled = isVerbose;
            Logger.InitLogFileName();
            Logger.WriteLog("");
            Logger.WriteLog("---------------- Program Start -- DemulShooterX64 v" + System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString() + " ----------------");

            // Parsing commandline arguments
            for (int i = 0; i < Args.Length; i++)
            {
                Logger.WriteLog("Cmdline arg " + i + " : " + Args[i]);
                if (Args[i].ToLower().Equals("-noinput"))
                {
                    _NoInput = true;
                }
                else if (Args[i].ToLower().StartsWith("-rom"))
                {
                    _Rom = (Args[i].Split('='))[1].Trim();
                }
                else if (Args[i].ToLower().StartsWith("-target"))
                {
                    _Target = (Args[i].Split('='))[1].Trim();
                }
            }
            if (_TrayIcon != null)
            {
                _TrayIcon.Text += "[" + _Target + "] [" + _Rom + "]";
            }

            //Finding plugged devices
            _AvailableControllers = RawInputHelper.GetRawInputDevices(new RawInputDeviceType[] { RawInputDeviceType.RIM_TYPEHID, RawInputDeviceType.RIM_TYPEMOUSE });
            Logger.WriteLog("Found " + _AvailableControllers.Length + " available RawInput devices :");
            foreach (RawInputController c in _AvailableControllers)
            {
                try
                {
                    Logger.WriteLog(" + [" + c.DeviceType.ToString() + "] " + c.DeviceName);
                }
                catch (Exception ex)
                {
                    Logger.WriteLog("ERROR : " + ex.Message.ToString());
                }
            }

            //Reading config file to get parameters
            _Configurator = new Configurator();
            _Configurator.ReadDsConfig(AppDomain.CurrentDomain.BaseDirectory + @"\" + CONF_FILENAME);
            foreach (PlayerSettings Player in _Configurator.PlayersSettings)
            {
                Logger.WriteLog("P" + Player.ID + " mode = " + Player.Mode);
                if (Player.Mode == PlayerSettings.PLAYER_MODE_RAWINPUT)
                {
                    Logger.WriteLog("P" + Player.ID + " device = " + Player.DeviceName);
                    foreach (RawInputController Controller in _AvailableControllers)
                    {
                        if (Controller.DeviceName == Player.DeviceName)
                        {
                            Player.RIController = Controller;
                            Player.RIController.Selected_AxisX = Player.HidAxisX;
                            Player.RIController.Selected_AxisY = Player.HidAxisY;
                            Player.RIController.Selected_OnScreenTriggerButton  = Player.HidButton_OnScreenTrigger;
                            Player.RIController.Selected_ActionButton           = Player.HidButton_Action;
                            Player.RIController.Selected_OffScreenTriggerButton = Player.HidButton_OffScreenTrigger;
                            Logger.WriteLog("P" + Player.ID + " device plugged and found, Handle = 0x" + Controller.DeviceHandle);
                            break;
                        }
                    }
                }
                else
                {
                    Logger.WriteLog("P" + Player.ID + " Gamepad ID = " + Player.GamepadID);
                }
            }


            CreateRawMessageWindow();
            //Register to RawInput thanks to the previously created window Handle
            RawInputDevice[] rid = new RawInputDevice[3];
            rid[0].UsagePage  = HidUsagePage.GENERIC;
            rid[0].Usage      = HidUsage.Joystick;
            rid[0].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[0].hwndTarget = _RawMessageWnd_hWnd;

            rid[1].UsagePage  = HidUsagePage.GENERIC;
            rid[1].Usage      = HidUsage.Mouse;
            rid[1].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[1].hwndTarget = _RawMessageWnd_hWnd;

            rid[2].UsagePage  = HidUsagePage.GENERIC;
            rid[2].Usage      = HidUsage.Gamepad;
            rid[2].dwFlags    = RawInputDeviceFlags.RIDEV_INPUTSINK;
            rid[2].hwndTarget = _RawMessageWnd_hWnd;
            if (!Win32API.RegisterRawInputDevices(rid, (uint)rid.Length, (uint)Marshal.SizeOf(rid[0])))
            {
                MessageBox.Show("Failed to register raw input device(s).", "DemulShooter Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

            //Starting Mame-style output daemon
            if (_Configurator.OutputEnabled)
            {
                Logger.WriteLog("Starting Output daemon...");
                _OutputHelper = new MameOutputHelper(_RawMessageWnd_hWnd, _Configurator.OutputCustomRecoilOnDelay, _Configurator.OutputCustomRecoilOffDelay, _Configurator.OutputCustomDamagedDelay);
                _OutputHelper.Start();
                _OutputUpdateLoop = new Thread(new ThreadStart(ReadAndSendOutput_Thread));
                _OutputUpdateLoop.Start();
            }

            //Starting the fun...
            if (_Target.Length > 0 && (_Rom.Length > 0))
            {
                //Install Low-Level mouse hook
                ApplyMouseHook();

                //Install Low Level keyboard hook
                ApplyKeyboardHook();

                /*
                 * //Running Xinput daemon if needed
                 * bool EnableXInputProc = false;
                 * foreach (ControllerDevice Device in _ControllerDevices)
                 * {
                 *  if (Device.GamepadID != -1)
                 *  {
                 *      EnableXInputProc = true;
                 *      break;
                 *  }
                 * }
                 * if (EnableXInputProc)
                 *  Bgw_XInput.RunWorkerAsync();
                 */
                if (_Target.Equals("alls"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "hodsd":
                    {
                        _Game = new Game_AllsHodSd(_Rom.ToLower(), _NoInput, isVerbose);
                    }; break;
                    }
                }

                else if (_Target.Equals("es3"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "tc5":
                    {
                        _Game = new Game_Es3Tc5(_Rom.ToLower(), _NoInput, isVerbose);
                    }; break;
                    }
                }

                else if (_Target.Equals("seganu"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "lma":
                    {
                        _Game = new Game_NuLuigiMansion_v2(_Rom.ToLower(), _NoInput, isVerbose);
                    }; break;
                    }
                }


                //W.I.P Games
                else if (_Target.Equals("windows"))
                {
                    switch (_Rom.ToLower())
                    {
                    case "bhapc":
                    {
                        _Game = new Game_Bhapc(_Rom.ToLower(), _NoInput, isVerbose);
                    } break;
                    }
                }

                _Game.OnGameHooked += new Game.GameHookedHandler(OnGameHooked);
            }
        }