public static UserScreen[] AllScreens() { Display[] all = User32Util.GetDisplays(); UserScreen[] rects = new UserScreen[all.Length]; for (int i = 0; i < rects.Length; i++) { rects[i] = new UserScreen(all[i].Bounds); } return(rects); }
public static UserScreen[] AllScreens() { Screen[] all = Screen.AllScreens; UserScreen[] rects = new UserScreen[all.Length]; //Rectangle[] test = GetSetup_Triple4kHorizontal(); //UserScreen[] rects = new UserScreen[test.Length]; for (int i = 0; i < rects.Length; i++) { UserScreen u = new UserScreen(); u.monitorBounds = all[i].Bounds; //u.monitorBounds = test[i]; u.bounds = u.monitorBounds; rects[i] = u; } return rects; }
public static UserScreen[] AllScreens() { Screen[] all = Screen.AllScreens; UserScreen[] rects = new UserScreen[all.Length]; //Rectangle[] test = GetSetup_Triple4kHorizontal(); //UserScreen[] rects = new UserScreen[test.Length]; for (int i = 0; i < rects.Length; i++) { UserScreen u = new UserScreen(); u.monitorBounds = all[i].Bounds; //u.monitorBounds = test[i]; u.bounds = u.monitorBounds; rects[i] = u; } return(rects); }
public string Play() { if (handlerData.ForceFinishOnPlay) { ProcessUtil.ForceKill(Path.GetFileNameWithoutExtension(handlerData.ExecutableName.ToLower())); } List <PlayerInfo> players = profile.PlayerData; for (int i = 0; i < players.Count; i++) { players[i].PlayerID = i; } UserScreen[] all = ScreensUtil.AllScreens(); string nucleusRootFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); string tempDir = GameManager.Instance.GempTempFolder(handlerData); string exeFolder = Path.GetDirectoryName(userGame.ExePath).ToLower(); string rootFolder = exeFolder; string workingFolder = exeFolder; if (!string.IsNullOrEmpty(handlerData.BinariesFolder)) { rootFolder = StringUtil.ReplaceCaseInsensitive(exeFolder, handlerData.BinariesFolder.ToLower(), ""); } if (!string.IsNullOrEmpty(handlerData.WorkingFolder)) { workingFolder = Path.Combine(exeFolder, handlerData.WorkingFolder.ToLower()); } bool first = true; bool keyboard = false; //if (handlerData.SupportsKeyboard) //{ // // make sure the keyboard player is the last to be started, // // so it will get the focus by default // KeyboardPlayer player = (KeyboardPlayer)profile.Options["KeyboardPlayer"]; // if (player.Value != -1) // { // keyboard = true; // List<PlayerInfo> newPlayers = new List<PlayerInfo>(); // for (int i = 0; i < players.Count; i++) // { // PlayerInfo p = players[i]; // if (i == player.Value) // { // continue; // } // newPlayers.Add(p); // } // newPlayers.Add(players[player.Value]); // players = newPlayers; // } //} for (int i = 0; i < players.Count; i++) { PlayerInfo player = players[i]; ProcessInfo procData = player.ProcessData; bool hasSetted = procData != null && procData.Setted; if (i > 0 && (handlerData.KillMutex?.Length > 0 || !hasSetted)) { PlayerInfo before = players[i - 1]; for (; ;) { if (exited > 0) { return(""); } Thread.Sleep(1000); if (handlerData.KillMutex != null) { if (handlerData.KillMutex.Length > 0 && !before.ProcessData.KilledMutexes) { // check for the existence of the mutexes // before invoking our StartGame app to kill them ProcessInfo pdata = before.ProcessData; if (StartGameUtil.MutexExists(pdata.Process, handlerData.KillMutex)) { // mutexes still exist, must kill StartGameUtil.KillMutex(pdata.Process, handlerData.KillMutex); pdata.KilledMutexes = true; break; } else { // mutexes dont exist anymore break; } } } else { break; } } } Rectangle playerBounds = player.MonitorBounds; UserScreen owner = player.Owner; int width = playerBounds.Width; int height = playerBounds.Height; bool isFullscreen = owner.Type == UserScreenType.FullScreen; string exePath; string linkFolder; string linkBinFolder; if (handlerData.SymlinkGame || handlerData.HardcopyGame) { List <string> dirExclusions = new List <string>(); List <string> fileExclusions = new List <string>(); List <string> fileCopies = new List <string>(); // symlink the game folder (and not the bin folder, if we have one) linkFolder = Path.Combine(tempDir, "Instance" + i); Directory.CreateDirectory(linkFolder); linkBinFolder = linkFolder; if (!string.IsNullOrEmpty(handlerData.BinariesFolder)) { linkBinFolder = Path.Combine(linkFolder, handlerData.BinariesFolder); dirExclusions.Add(handlerData.BinariesFolder); } exePath = Path.Combine(linkBinFolder, Path.GetFileName(this.userGame.ExePath)); if (!string.IsNullOrEmpty(handlerData.WorkingFolder)) { linkBinFolder = Path.Combine(linkFolder, handlerData.WorkingFolder); dirExclusions.Add(handlerData.WorkingFolder); } // some games have save files inside their game folder, so we need to access them inside the loop jsData[Folder.InstancedGameFolder.ToString()] = linkFolder; if (handlerData.Hook.CustomDllEnabled) { fileExclusions.Add("xinput1_3.dll"); fileExclusions.Add("ncoop.ini"); } if (!handlerData.SymlinkExe) { fileCopies.Add(handlerData.ExecutableName.ToLower()); } // additional ignored files by the generic info if (handlerData.FileSymlinkExclusions != null) { string[] symlinkExclusions = handlerData.FileSymlinkExclusions; for (int k = 0; k < symlinkExclusions.Length; k++) { string s = symlinkExclusions[k]; // make sure it's lower case fileExclusions.Add(s.ToLower()); } } if (handlerData.FileSymlinkCopyInstead != null) { string[] fileSymlinkCopyInstead = handlerData.FileSymlinkCopyInstead; for (int k = 0; k < fileSymlinkCopyInstead.Length; k++) { string s = fileSymlinkCopyInstead[k]; // make sure it's lower case fileCopies.Add(s.ToLower()); } } if (handlerData.DirSymlinkExclusions != null) { string[] symlinkExclusions = handlerData.DirSymlinkExclusions; for (int k = 0; k < symlinkExclusions.Length; k++) { string s = symlinkExclusions[k]; // make sure it's lower case dirExclusions.Add(s.ToLower()); } } string[] fileExclusionsArr = fileExclusions.ToArray(); string[] fileCopiesArr = fileCopies.ToArray(); if (handlerData.HardcopyGame) { // copy the directory //int exitCode; //FileUtil.CopyDirectory(rootFolder, new DirectoryInfo(rootFolder), linkFolder, out exitCode, dirExclusions.ToArray(), fileExclusionsArr, true); } else { int exitCode; CmdUtil.LinkDirectory(rootFolder, new DirectoryInfo(rootFolder), linkFolder, out exitCode, dirExclusions.ToArray(), fileExclusionsArr, fileCopiesArr, true); if (!handlerData.SymlinkExe) { //File.Copy(userGame.ExePath, exePath, true); } } } else { exePath = userGame.ExePath; linkBinFolder = rootFolder; linkFolder = workingFolder; } HandlerContext context = handlerData.CreateContext(profile, player); context.PlayerID = player.PlayerID; context.IsFullscreen = isFullscreen; context.ExePath = exePath; context.RootInstallFolder = exeFolder; context.RootFolder = linkFolder; handlerData.PrePlay(context, player); string startArgs = context.StartArguments; if (context.Hook.CustomDllEnabled) { byte[] xdata = Properties.Resources.xinput1_3; if (context.Hook.XInputNames == null) { using (Stream str = File.OpenWrite(Path.Combine(linkBinFolder, "xinput1_3.dll"))) { str.Write(xdata, 0, xdata.Length); } } else { string[] xinputs = context.Hook.XInputNames; for (int z = 0; z < xinputs.Length; z++) { string xinputName = xinputs[z]; using (Stream str = File.OpenWrite(Path.Combine(linkBinFolder, xinputName))) { str.Write(xdata, 0, xdata.Length); } } } string ncoopIni = Path.Combine(linkBinFolder, "ncoop.ini"); using (Stream str = File.OpenWrite(ncoopIni)) { byte[] ini = Properties.Resources.ncoop; str.Write(ini, 0, ini.Length); } IniFile x360 = new IniFile(ncoopIni); x360.IniWriteValue("Options", "ForceFocus", handlerData.Hook.ForceFocus.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "ForceFocusWindowName", handlerData.Hook.ForceFocusWindowName.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "WindowX", playerBounds.X.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "WindowY", playerBounds.Y.ToString(CultureInfo.InvariantCulture)); if (context.Hook.SetWindowSize) { x360.IniWriteValue("Options", "ResWidth", context.Width.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "ResHeight", context.Height.ToString(CultureInfo.InvariantCulture)); } else { x360.IniWriteValue("Options", "ResWidth", "0"); x360.IniWriteValue("Options", "ResHeight", "0"); } x360.IniWriteValue("Options", "RerouteInput", context.Hook.XInputReroute.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "RerouteJoystickTemplate", JoystickDatabase.GetID(player.GamepadProductGuid.ToString()).ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "EnableMKBInput", player.IsKeyboardPlayer.ToString(CultureInfo.InvariantCulture)); // windows events x360.IniWriteValue("Options", "BlockInputEvents", context.Hook.BlockInputEvents.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "BlockMouseEvents", context.Hook.BlockMouseEvents.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "BlockKeyboardEvents", context.Hook.BlockKeyboardEvents.ToString(CultureInfo.InvariantCulture)); // xinput x360.IniWriteValue("Options", "XInputEnabled", context.Hook.XInputEnabled.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "XInputPlayerID", player.GamepadId.ToString(CultureInfo.InvariantCulture)); // dinput x360.IniWriteValue("Options", "DInputEnabled", context.Hook.DInputEnabled.ToString(CultureInfo.InvariantCulture)); x360.IniWriteValue("Options", "DInputGuid", player.GamepadGuid.ToString().ToUpper()); x360.IniWriteValue("Options", "DInputForceDisable", context.Hook.DInputForceDisable.ToString()); } Process proc; if (context.NeedsSteamEmulation) { string steamEmu = GameManager.Instance.ExtractSteamEmu(Path.Combine(linkFolder, "SmartSteamLoader")); //string steamEmu = GameManager.Instance.ExtractSteamEmu(); if (string.IsNullOrEmpty(steamEmu)) { return("Extraction of SmartSteamEmu failed!"); } string emuExe = Path.Combine(steamEmu, "SmartSteamLoader.exe"); string emuIni = Path.Combine(steamEmu, "SmartSteamEmu.ini"); IniFile emu = new IniFile(emuIni); emu.IniWriteValue("Launcher", "Target", exePath); emu.IniWriteValue("Launcher", "StartIn", Path.GetDirectoryName(exePath)); emu.IniWriteValue("Launcher", "CommandLine", startArgs); emu.IniWriteValue("Launcher", "SteamClientPath", Path.Combine(steamEmu, "SmartSteamEmu.dll")); emu.IniWriteValue("Launcher", "SteamClientPath64", Path.Combine(steamEmu, "SmartSteamEmu64.dll")); emu.IniWriteValue("Launcher", "InjectDll", "1"); emu.IniWriteValue("SmartSteamEmu", "AppId", context.SteamID); //emu.IniWriteValue("SmartSteamEmu", "SteamIdGeneration", "Static"); //string userName = $"Player { context.PlayerID }"; //emu.IniWriteValue("SmartSteamEmu", "PersonaName", userName); //emu.IniWriteValue("SmartSteamEmu", "ManualSteamId", userName); //emu.IniWriteValue("SmartSteamEmu", "Offline", "False"); //emu.IniWriteValue("SmartSteamEmu", "MasterServer", ""); //emu.IniWriteValue("SmartSteamEmu", "MasterServerGoldSrc", ""); handlerData.SetupSse?.Invoke(); if (context.KillMutex?.Length > 0) { // to kill the mutexes we need to orphanize the process proc = ProcessUtil.RunOrphanProcess(emuExe); } else { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = emuExe; proc = Process.Start(startInfo); } player.SteamEmu = true; } else { if (context.KillMutex?.Length > 0) { proc = Process.GetProcessById(StartGameUtil.StartGame( new DirectoryInfo(exePath).GetRelativePath(nucleusRootFolder), startArgs, new DirectoryInfo(linkFolder).GetRelativePath(nucleusRootFolder))); } else { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = exePath; //startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = startArgs; startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Path.GetDirectoryName(exePath); proc = Process.Start(startInfo); } if (proc == null) { for (int times = 0; times < 200; times++) { Thread.Sleep(50); Process[] procs = Process.GetProcesses(); string proceName = Path.GetFileNameWithoutExtension(context.ExecutableName).ToLower(); string launcherName = Path.GetFileNameWithoutExtension(context.LauncherExe).ToLower(); for (int j = 0; j < procs.Length; j++) { Process p = procs[j]; string lowerP = p.ProcessName.ToLower(); if (((lowerP == proceName) || lowerP == launcherName) && !attached.Contains(p)) { attached.Add(p); proc = p; break; } } if (proc != null) { break; } } } else { attached.Add(proc); } } ProcessInfo data = new ProcessInfo(proc); data.Position = new Point(playerBounds.X, playerBounds.Y); data.Size = new Size(playerBounds.Width, playerBounds.Height); data.KilledMutexes = context.KillMutex?.Length == 0; player.ProcessData = data; first = false; Thread.Sleep(TimeSpan.FromSeconds(handlerData.PauseBetweenStarts)); } return(string.Empty); }