using SharpSteam; using System; using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; using System.Threading; using System.Windows; using VDFParser; using VDFParser.Models; namespace UWPHook { /// /// Interaction logic for GamesWindow.xaml /// public partial class GamesWindow : Window { AppEntryModel Apps; BackgroundWorker bwr; public GamesWindow() { InitializeComponent(); Apps = new AppEntryModel(); listGames.ItemsSource = Apps.Entries; //If null or 1, the app was launched normally if (Environment.GetCommandLineArgs() != null) { //When length is 1, the only argument is the path where the app is installed if (Environment.GetCommandLineArgs().Length > 1) { Launcher(); } } } private void Launcher() { this.Title = "UWPHook: Playing a game"; //Hide the window so the app is launched seamless making UWPHook run in the background without bothering the user this.Hide(); string currentLanguage = CultureInfo.CurrentCulture.ToString(); try { //Some apps have their language locked to the UI language of the system, so overriding it might change the language of the game //I my self couldn't get this to work on neither Forza Horizon 3 or Halo 5 Forge, @AbGedreht reported it works tho if (Properties.Settings.Default.ChangeLanguage && !String.IsNullOrEmpty(Properties.Settings.Default.TargetLanguage)) { ScriptManager.RunScript("Set-WinUILanguageOverride " + Properties.Settings.Default.TargetLanguage); } //The only other parameter Steam will send is the app AUMID AppManager.LaunchUWPApp(Environment.GetCommandLineArgs()[1]); //While the current launched app is running, sleep for n seconds and then check again while (AppManager.IsRunning()) { Thread.Sleep(Properties.Settings.Default.Seconds * 1000); } } catch (Exception e) { this.Show(); MessageBox.Show(e.Message, "UWPHook", MessageBoxButton.OK, MessageBoxImage.Warning); } finally { if (Properties.Settings.Default.ChangeLanguage && !String.IsNullOrEmpty(Properties.Settings.Default.TargetLanguage)) { ScriptManager.RunScript("Set - WinUILanguageOverride " + currentLanguage); } //The user has probably finished using the app, so let's close UWPHook to keep the experience clean this.Close(); } } private void ExportButton_Click(object sender, RoutedEventArgs e) { string steam_folder = SteamManager.GetSteamFolder(); if (!String.IsNullOrEmpty(steam_folder)) { var users = SteamManager.GetUsers(steam_folder); var selected_apps = Apps.Entries.Where(app => app.Selected); foreach (var user in users) { VDFEntry[] shortcuts; try { shortcuts = SteamManager.ReadShortcuts(user); } catch (Exception ex) { throw new Exception("Error trying to load existing Steam shortcuts." + Environment.NewLine + ex.Message); } //TODO: Figure out what to do when user has no shortcuts whatsoever if (shortcuts != null && shortcuts.Length > 0) { foreach (var app in selected_apps) { VDFEntry newApp = new VDFEntry() { AppName = app.Name, Exe = @"""" + System.Reflection.Assembly.GetExecutingAssembly().Location + @""" " + app.Aumid, StartDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), AllowDesktopConfig = 1, Icon = "", Index = shortcuts.Length, IsHidden = 0, OpenVR = 0, ShortcutPath = "", Tags = new string[0] }; //Resize this array so it fits the new entries Array.Resize(ref shortcuts, shortcuts.Length + 1); shortcuts[shortcuts.Length - 1] = newApp; } try { //Write the file with all the shortcuts File.WriteAllBytes(user + @"\\config\\shortcuts.vdf", VDFSerializer.Serialize(shortcuts)); } catch (Exception ex) { throw new Exception("Error while trying to write your Steam shortcuts" + Environment.NewLine + ex.Message); } } } } MessageBox.Show("UWPHook", "Your apps were successfuly exported, please restart Steam in order to see your app on it.", MessageBoxButton.OK, MessageBoxImage.Information); } private void LoadButton_Click(object sender, RoutedEventArgs e) { bwr = new BackgroundWorker(); bwr.DoWork += Bwr_DoWork; bwr.RunWorkerCompleted += Bwr_RunWorkerCompleted; grid.IsEnabled = false; progressBar.Visibility = Visibility.Visible; bwr.RunWorkerAsync(); } private void Bwr_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { grid.IsEnabled = true; listGames.Columns[2].IsReadOnly = true; progressBar.Visibility = Visibility.Collapsed; label.Content = "Installed Apps"; } private void Bwr_DoWork(object sender, DoWorkEventArgs e) { try { var installedApps = AppManager.GetInstalledApps(); foreach (var app in installedApps) { //Remove end lines from the String and split both values, I split the appname and the AUMID using | //I hope no apps have that in their name. Ever. var valor = app.Replace("\r\n", "").Split('|'); if (!String.IsNullOrEmpty(valor[0])) { Application.Current.Dispatcher.BeginInvoke((Action)delegate () { Apps.Entries.Add(new AppEntry() { Name = valor[0], Aumid = valor[1], Selected = false }); }); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "UWPHook", MessageBoxButton.OK, MessageBoxImage.Error); } } private void HelpButton_Click(object sender, RoutedEventArgs e) { SettingsWindow window = new SettingsWindow(); window.ShowDialog(); } } }