#region Copyright & License Information /* * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, * see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Media; using System.Reflection; using System.Windows.Forms; namespace OpenRA { class GameMonitor { static string processName = "OpenRA.Game.exe"; static Process gameProcess; [STAThread] static void Main(string[] args) { var psi = new ProcessStartInfo(processName, string.Join(" ", args)); try { gameProcess = Process.Start(psi); } catch { return; } if (gameProcess == null) return; gameProcess.EnableRaisingEvents = true; gameProcess.Exited += GameProcessExited; Application.Run(); } static void ShowErrorDialog() { var form = new Form { Size = new Size(315, 140), Text = "Fatal Error", MinimizeBox = false, MaximizeBox = false, FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterScreen, TopLevel = true, Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location) }; var notice = new Label { Location = new Point(10, 10), AutoSize = true, Text = "OpenRA has encountered a fatal error and must close.{0}Refer to the crash logs and FAQ for more information.".F(Environment.NewLine), TextAlign = ContentAlignment.TopCenter }; var viewLogs = new Button { Location = new Point(10, 80), Size = new Size(75, 23), Text = "View Logs" }; var viewFaq = new Button { Location = new Point(90, 80), Size = new Size(75, 23), Text = "View FAQ" }; var quit = new Button { Location = new Point(225, 80), Size = new Size(75, 23), Text = "Quit", DialogResult = DialogResult.Cancel }; form.Controls.Add(notice); form.Controls.Add(viewLogs); form.Controls.Add(viewFaq); form.Controls.Add(quit); viewLogs.Click += ViewLogsClicked; viewFaq.Click += ViewFaqClicked; form.FormClosed += FormClosed; SystemSounds.Exclamation.Play(); form.ShowDialog(); } static void GameProcessExited(object sender, EventArgs e) { if (!(gameProcess.ExitCode == (int)RunStatus.Success || gameProcess.ExitCode == (int)RunStatus.Restart)) ShowErrorDialog(); Exit(); } static void ViewLogsClicked(object sender, EventArgs e) { try { Process.Start(Platform.ResolvePath("^", "Logs")); } catch { } } static void ViewFaqClicked(object sender, EventArgs e) { try { Process.Start("http://wiki.openra.net/FAQ"); } catch { } } static void FormClosed(object sender, EventArgs e) { Exit(); } static void Exit() { Environment.Exit(0); } } }