public void Update(double delayMS) { if (profile == null) { return; } exited = 0; List <PlayerInfo> players = profile.PlayerData; timer += delayMS; bool updatedHwnd = false; if (timer > HWndInterval) { updatedHwnd = true; timer = 0; } for (int i = 0; i < players.Count; i++) { PlayerInfo p = players[i]; ProcessInfo data = p.ProcessData; if (data == null) { continue; } if (data.Finished) { if (data.Process.HasExited) { exited++; } continue; } if (p.SteamEmu) { List <int> children = ProcessUtil.GetChildrenProcesses(data.Process); // catch the game process, that was spawned from Smart Steam Emu if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process child = Process.GetProcessById(id); try { if (child.ProcessName.Contains("conhost")) { continue; } } catch { continue; } data.AssignProcess(child); p.SteamEmu = child.ProcessName.Contains("SmartSteamLoader") || child.ProcessName.Contains("cmd"); } } } else { if (updatedHwnd) { if (data.Setted) { if (data.Process.HasExited) { exited++; continue; } data.HWnd.TopMost = true; if (data.Status == 2) { uint lStyle = User32Interop.GetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_STYLE); lStyle = lStyle & ~User32_WS.WS_CAPTION; lStyle = lStyle & ~User32_WS.WS_THICKFRAME; lStyle = lStyle & ~User32_WS.WS_MINIMIZE; lStyle = lStyle & ~User32_WS.WS_MAXIMIZE; lStyle = lStyle & ~User32_WS.WS_SYSMENU; User32Interop.SetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_STYLE, lStyle); lStyle = User32Interop.GetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_EXSTYLE); lStyle = lStyle & ~User32_WS.WS_EX_DLGMODALFRAME; lStyle = lStyle & ~User32_WS.WS_EX_CLIENTEDGE; lStyle = lStyle & ~User32_WS.WS_EX_STATICEDGE; User32Interop.SetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_EXSTYLE, lStyle); User32Interop.SetWindowPos(data.HWnd.NativePtr, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_FRAMECHANGED | PositioningFlags.SWP_NOMOVE | PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOZORDER | PositioningFlags.SWP_NOOWNERZORDER)); //User32Interop.SetForegroundWindow(data.HWnd.NativePtr); data.Finished = true; Debug.WriteLine("State 2"); if (i == players.Count - 1 && handlerData.LockMouse) { //last screen setuped _cursorModule.SetActiveWindow(); } } else if (data.Status == 1) { data.HWnd.Location = data.Position; data.Status++; Debug.WriteLine("State 1"); if (handlerData.LockMouse) { if (p.IsKeyboardPlayer) { _cursorModule.Setup(data.Process, p.MonitorBounds); } else { _cursorModule.AddOtherGameHandle(data.Process.MainWindowHandle); } } } else if (data.Status == 0) { data.HWnd.Size = data.Size; data.Status++; Debug.WriteLine("State 0"); } } else { data.Process.Refresh(); if (data.Process.HasExited) { if (p.GotLauncher) { if (p.GotGame) { exited++; } else { List <int> children = ProcessUtil.GetChildrenProcesses(data.Process); if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process pro = Process.GetProcessById(id); if (!attached.Contains(pro)) { attached.Add(pro); data.HWnd = null; p.GotGame = true; data.AssignProcess(pro); } } } } } else { // Steam showing a launcher, need to find our game process string launcher = handlerData.LauncherExe; if (!string.IsNullOrEmpty(launcher)) { if (launcher.ToLower().EndsWith(".exe")) { launcher = launcher.Remove(launcher.Length - 4, 4); } Process[] procs = Process.GetProcessesByName(launcher); for (int j = 0; j < procs.Length; j++) { Process pro = procs[j]; if (!attached.Contains(pro)) { attached.Add(pro); data.AssignProcess(pro); p.GotLauncher = true; } } } } } else { if (data.HWNDRetry || data.HWnd == null || data.HWnd.NativePtr != data.Process.MainWindowHandle) { data.HWnd = new HwndObject(data.Process.MainWindowHandle); Point pos = data.HWnd.Location; if (String.IsNullOrEmpty(data.HWnd.Title) || pos.X == -32000 || data.HWnd.Title.ToLower() == handlerData.LauncherTitle.ToLower()) { data.HWNDRetry = true; } else if (!string.IsNullOrEmpty(handlerData.Hook.ForceFocusWindowName) && // TODO: this Levenshtein distance is being used to help us around Call of Duty Black Ops, as it uses a ® icon in the title bar // there must be a better way StringUtil.ComputeLevenshteinDistance(data.HWnd.Title, handlerData.Hook.ForceFocusWindowName) > 2) { data.HWNDRetry = true; } else { Size s = data.Size; data.Setted = true; } } } } } } } if (exited == players.Count) { if (!hasEnded) { End(); } } }
public void Update(int delayMS) { if (profile == null) { return; } exited = 0; List <PlayerInfo> players = profile.PlayerData; timer += delayMS; for (int i = 0; i < players.Count; i++) { PlayerInfo p = players[i]; ProcessData data = p.ProcessData; if (data == null) { continue; } if (p.SteamEmu) { List <int> children = ProcessUtil.GetChildrenProcesses(data.Process); // catch the game process, that was spawned from Smart Steam Emu if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process child = Process.GetProcessById(id); try { if (child.ProcessName.Contains("conhost")) { continue; } } catch { continue; } data.AssignProcess(child); p.SteamEmu = child.ProcessName.Contains("SmartSteamLoader") || child.ProcessName.Contains("cmd"); } } } else { if (data.Setted) { if (data.Process.HasExited) { exited++; continue; } if (!p.ProcessData.KilledMutexes && gen.KillMutex.Length > 0) { StartGameUtil.KillMutex(data.Process, gen.KillMutex); p.ProcessData.KilledMutexes = true; } uint lStyle = User32Interop.GetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_STYLE); if (lStyle != data.RegLong) { uint toRemove = User32_WS.WS_CAPTION; lStyle = lStyle & (~toRemove); User32Interop.SetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_STYLE, lStyle); data.RegLong = lStyle; data.HWnd.Location = data.Position; } data.HWnd.TopMost = true; if (p.IsKeyboardPlayer) { Rectangle r = p.MonitorBounds; Cursor.Clip = r; User32Interop.SetForegroundWindow(data.HWnd.NativePtr); } } else { data.Process.Refresh(); if (data.Process.HasExited) { if (p.GotLauncher) { if (p.GotGame) { exited++; } else { List <int> children = ProcessUtil.GetChildrenProcesses(data.Process); if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process pro = Process.GetProcessById(id); if (!attached.Contains(pro)) { attached.Add(pro); data.HWnd = null; p.GotGame = true; data.AssignProcess(pro); } } } } } else { // Steam showing a launcher, need to find our game process string launcher = gen.LauncherExe; if (launcher.ToLower().EndsWith(".exe")) { launcher = launcher.Remove(launcher.Length - 4, 4); } Process[] procs = Process.GetProcessesByName(launcher); for (int j = 0; j < procs.Length; j++) { Process pro = procs[j]; if (!attached.Contains(pro)) { attached.Add(pro); data.AssignProcess(pro); p.GotLauncher = true; } } } } else { if (data.HWNDRetry || data.HWnd == null || data.HWnd.NativePtr != data.Process.MainWindowHandle) { data.HWnd = new HwndObject(data.Process.MainWindowHandle); Point pos = data.HWnd.Location; if (String.IsNullOrEmpty(data.HWnd.Title) || pos.X == -32000 || data.HWnd.Title.ToLower() == gen.LauncherTitle.ToLower()) { data.HWNDRetry = true; } else { Size s = data.Size; data.Setted = true; data.HWnd.TopMost = true; data.HWnd.Size = data.Size; data.HWnd.Location = data.Position; } } } } } } if (exited == players.Count) { if (!hasEnded) { End(); } } }
public void Update(int delayMS) { if (profile == null) { return; } exited = 0; List <PlayerInfo> players = profile.PlayerData; timer += delayMS; for (int i = 0; i < players.Count; i++) { PlayerInfo p = players[i]; if (p.screenData == null || p.Process == null) { continue; } if (p.SteamEmu) { List <int> children = ProcessUtil.GetChildrenProcesses(p.Process); if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process child = Process.GetProcessById(id); try { if (child.ProcessName.Contains("conhost")) { continue; } } catch { continue; } p.Process = child; p.SteamEmu = child.ProcessName.Contains("SmartSteamLoader") || child.ProcessName.Contains("cmd"); } } } else { ScreenData data = p.screenData; if (data.Set) { if (p.Process.HasExited) { exited++; continue; } if (!p.screenData.KilledMutexes && gen.KillMutex.Length > 0) { StartGameUtil.KillMutex(p.Process, gen.KillMutex); p.screenData.KilledMutexes = true; } uint lStyle = User32Interop.GetWindowLong(data.HWND.Hwnd, User32_WS.GWL_STYLE); if (lStyle != data.RegLong) { uint toRemove = User32_WS.WS_CAPTION; lStyle = lStyle & (~toRemove); User32Interop.SetWindowLong(data.HWND.Hwnd, User32_WS.GWL_STYLE, lStyle); data.RegLong = lStyle; data.HWND.Location = data.Position; } } else { p.Process.Refresh(); if (p.Process.HasExited) { if (p.GotLauncher) { if (p.GotGame) { exited++; } else { List <int> children = ProcessUtil.GetChildrenProcesses(p.Process); if (children.Count > 0) { for (int j = 0; j < children.Count; j++) { int id = children[j]; Process pro = Process.GetProcessById(id); if (!attached.Contains(pro)) { attached.Add(pro); data.HWND = null; p.GotGame = true; p.Process = pro; } } } } } else { // Steam showing a launcher, need to find our game process string launcher = gen.LauncherExe; if (launcher.ToLower().EndsWith(".exe")) { launcher = launcher.Remove(launcher.Length - 4, 4); } Process[] procs = Process.GetProcessesByName(launcher); for (int j = 0; j < procs.Length; j++) { Process pro = procs[j]; if (!attached.Contains(pro)) { attached.Add(pro); p.Process = pro; p.GotLauncher = true; } } } } else { if (data.HWNDRetry || data.HWND == null || data.HWND.Hwnd != p.Process.MainWindowHandle) { data.HWND = new HwndObject(p.Process.MainWindowHandle); Point pos = data.HWND.Location; if (String.IsNullOrEmpty(data.HWND.Title) || pos.X == -32000 || data.HWND.Title.ToLower() == gen.LauncherTitle.ToLower()) { data.HWNDRetry = true; } else { Size s = data.Size; data.Set = true; data.HWND.TopMost = true; data.HWND.Size = data.Size; data.HWND.Location = data.Position; } } } } } if (exited == players.Count) { if (!hasEnded) { hasEnded = true; GameManager.Instance.ExecuteBackup(this.userGame.Game); if (Ended != null) { Ended(); } } } } }