//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); } }
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); } }