/// <summary> /// Start with a LibHb EncodeJob Object /// </summary> /// <param name="task"> /// The task. /// </param> /// <param name="configuration"> /// The configuration. /// </param> public void Start(EncodeTask task, HBConfiguration configuration) { try { // Sanity Checking and Setup if (this.IsEncoding) { throw new GeneralApplicationException("HandBrake is already encoding a file.", "Please stop the current encode. If the problem persists, please restart HandBrake.", null); } // Setup this.startTime = DateTime.Now; this.currentTask = task; this.currentConfiguration = configuration; // Create a new HandBrake instance // Setup the HandBrake Instance this.log.Reset(); // Reset so we have a clean log for the start of the encode. this.ServiceLogMessage("Starting Encode ..."); this.instance = task.IsPreviewEncode ? HandBrakeInstanceManager.GetPreviewInstance(configuration.Verbosity) : HandBrakeInstanceManager.GetEncodeInstance(configuration.Verbosity); this.instance.EncodeCompleted += this.InstanceEncodeCompleted; this.instance.EncodeProgress += this.InstanceEncodeProgress; this.IsEncoding = true; this.isPreviewInstance = task.IsPreviewEncode; // Verify the Destination Path Exists, and if not, create it. this.VerifyEncodeDestinationPath(task); // Get an EncodeJob object for the Interop Library this.instance.StartEncode(EncodeFactory.Create(task, configuration)); // Fire the Encode Started Event this.InvokeEncodeStarted(System.EventArgs.Empty); } catch (Exception exc) { this.IsEncoding = false; this.ServiceLogMessage("Failed to start encoding ..." + Environment.NewLine + exc); this.InvokeEncodeCompleted(new EventArgs.EncodeCompletedEventArgs(false, exc, "Unable to start encoding", task.Source)); } }
/// <summary> /// Scan a Source Path. /// Title 0: scan all /// </summary> /// <param name="sourcePath"> /// Path to the file to scan /// </param> /// <param name="title"> /// int title number. 0 for scan all /// </param> /// <param name="postAction"> /// The post Action. /// </param> public void Scan(string sourcePath, int title, Action <bool, Source> postAction) { if (this.IsScanning) { return; } // Try to cleanup any previous scan instances. if (this.instance != null) { try { this.instance.Dispose(); } catch (Exception) { // Do Nothing } } this.isCancelled = false; // Reset the log this.logInstanceManager.ResetApplicationLog(); // Handle the post scan operation. this.postScanOperation = postAction; // Create a new HandBrake Instance. this.instance = HandBrakeInstanceManager.GetScanInstance(this.userSettingService.GetUserSetting <int>(UserSettingConstants.Verbosity)); this.instance.ScanProgress += this.InstanceScanProgress; this.instance.ScanCompleted += this.InstanceScanCompleted; // Start the scan on a back this.ScanSource(sourcePath, title, this.userSettingService.GetUserSetting <int>(UserSettingConstants.PreviewScanCount)); }
/// <summary> /// Override the startup behavior to handle files dropped on the app icon. /// </summary> /// <param name="e"> /// The StartupEventArgs. /// </param> protected override void OnStartup(StartupEventArgs e) { // We don't support Windows XP / 2003 / 2003 R2 / Vista / 2008 OperatingSystem os = Environment.OSVersion; if (((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 5)) || ((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 6 && os.Version.Minor < 1))) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsVersionWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (!Environment.Is64BitOperatingSystem) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsBitnessWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.Equals("--reset"))) { HandBrakeApp.ResetToDefaults(); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.StartsWith("--recover-queue-ids"))) { string command = e.Args.FirstOrDefault(f => f.StartsWith("--recover-queue-ids")); if (!string.IsNullOrEmpty(command)) { command = command.Replace("--recover-queue-ids=", string.Empty); List <string> processIds = command.Split(',').ToList(); StartupOptions.QueueRecoveryIds = processIds; } } if (e.Args.Any(f => f.Equals("--auto-start-queue"))) { StartupOptions.AutoRestartQueue = true; } // Portable Mode if (Portable.IsPortable()) { if (!Portable.Initialise()) { Application.Current.Shutdown(); return; } } // Setup the UI Language IUserSettingService userSettingService = IoC.Get <IUserSettingService>(); string culture = userSettingService.GetUserSetting <string>(UserSettingConstants.UiLanguage); if (!string.IsNullOrEmpty(culture)) { InterfaceLanguage language = InterfaceLanguageUtilities.FindInterfaceLanguage(culture); if (language != null) { CultureInfo ci = new CultureInfo(language.Culture); Thread.CurrentThread.CurrentUICulture = ci; } } DarkThemeMode useDarkTheme = (DarkThemeMode)userSettingService.GetUserSetting <int>(UserSettingConstants.DarkThemeMode); if (SystemInfo.IsWindows10()) { ResourceDictionary theme = new ResourceDictionary(); switch (useDarkTheme) { case DarkThemeMode.System: if (SystemInfo.IsAppsUsingDarkTheme()) { theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } else if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } break; case DarkThemeMode.Dark: theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); break; case DarkThemeMode.Light: if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); } break; default: break; } } // NO-Hardware Mode bool noHardware = e.Args.Any(f => f.Equals("--no-hardware")) || (Portable.IsPortable() && !Portable.IsHardwareEnabled()); // Initialise the Engine HandBrakeWPF.Helpers.LogManager.Init(); try { HandBrakeInstanceManager.Init(noHardware); } catch (Exception) { if (!noHardware) { MessageBox.Show(HandBrakeWPF.Properties.Resources.Startup_InitFailed, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); } throw; } // Initialise the GUI base.OnStartup(e); // If we have a file dropped on the icon, try scanning it. string[] args = e.Args; if (args.Any() && (File.Exists(args[0]) || Directory.Exists(args[0]))) { IMainViewModel mvm = IoC.Get <IMainViewModel>(); mvm.StartScan(args[0], 0); } }
public static string GetVersionShort() { IHandBrakeInstance instance = HandBrakeInstanceManager.GetScanInstance(1); return(string.Format("{0} {1}", instance.Version, instance.Build)); }
/// <summary> /// The get build. /// </summary> /// <returns> /// The <see cref="int"/>. /// </returns> public static string GetVersion() { IHandBrakeInstance instance = HandBrakeInstanceManager.GetScanInstance(1); return(IsNightly() ? string.Format("Nightly {0} ({1})", instance.Version, instance.Build) : string.Format("{0} ({1})", instance.Version, instance.Build)); }
/// <summary> /// Override the startup behavior to handle files dropped on the app icon. /// </summary> /// <param name="e"> /// The StartupEventArgs. /// </param> protected override void OnStartup(StartupEventArgs e) { // We don't support Windows XP / 2003 / 2003 R2 / Vista / 2008 OperatingSystem os = Environment.OSVersion; if (((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 5)) || ((os.Platform == PlatformID.Win32NT) && (os.Version.Major == 6 && os.Version.Minor < 1))) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsVersionWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (!Environment.Is64BitOperatingSystem) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsBitnessWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.Equals("--reset"))) { HandBrakeApp.ResetToDefaults(); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.StartsWith("--recover-queue-ids"))) { string command = e.Args.FirstOrDefault(f => f.StartsWith("--recover-queue-ids")); if (!string.IsNullOrEmpty(command)) { command = command.Replace("--recover-queue-ids=", string.Empty); List <string> processIds = command.Split(',').ToList(); StartupOptions.QueueRecoveryIds = processIds; } } if (e.Args.Any(f => f.Equals("--auto-start-queue"))) { StartupOptions.AutoRestartQueue = true; } // Portable Mode if (Portable.IsPortable()) { if (!Portable.Initialise()) { Application.Current.Shutdown(); return; } } // Setup the UI Language IUserSettingService userSettingService = IoC.Get <IUserSettingService>(); string culture = userSettingService.GetUserSetting <string>(UserSettingConstants.UiLanguage); if (!string.IsNullOrEmpty(culture)) { InterfaceLanguage language = InterfaceLanguageUtilities.FindInterfaceLanguage(culture); if (language != null) { CultureInfo ci = new CultureInfo(language.Culture); Thread.CurrentThread.CurrentUICulture = ci; } } int runCounter = userSettingService.GetUserSetting <int>(UserSettingConstants.RunCounter); if (!SystemInfo.IsWindows10() && runCounter < 2) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OldOperatingSystem, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); } // Software Rendering if (e.Args.Any(f => f.Equals("--force-software-rendering")) || Portable.IsForcingSoftwareRendering() || userSettingService.GetUserSetting <bool>(UserSettingConstants.ForceSoftwareRendering)) { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; } // Check if the user would like to check for updates AFTER the first run, but only once. if (runCounter == 1) { CheckForUpdateCheckPermission(userSettingService); } // Increment the counter so we can change startup behavior for the above warning and update check question. userSettingService.SetUserSetting(UserSettingConstants.RunCounter, runCounter + 1); // Only display once. // App Theme DarkThemeMode useDarkTheme = (DarkThemeMode)userSettingService.GetUserSetting <int>(UserSettingConstants.DarkThemeMode); if (SystemInfo.IsWindows10()) { ResourceDictionary dark = new ResourceDictionary { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Themes/Dark.Blue.xaml") }; ResourceDictionary light = new ResourceDictionary { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml") }; ResourceDictionary theme = new ResourceDictionary(); switch (useDarkTheme) { case DarkThemeMode.System: if (SystemInfo.IsAppsUsingDarkTheme()) { theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); Application.Current.Resources.MergedDictionaries.Add(dark); } else if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); Application.Current.Resources.MergedDictionaries.Add(light); } break; case DarkThemeMode.Dark: theme.Source = new Uri("Themes/Dark.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); Application.Current.Resources.MergedDictionaries.Add(dark); break; case DarkThemeMode.Light: if (!SystemParameters.HighContrast) { theme.Source = new Uri("Themes/Light.xaml", UriKind.Relative); Application.Current.Resources.MergedDictionaries.Add(theme); Application.Current.Resources.MergedDictionaries.Add(light); } break; } } Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Views/Styles/Styles.xaml", UriKind.Relative) }); // NO-Hardware Mode bool noHardware = e.Args.Any(f => f.Equals("--no-hardware")) || (Portable.IsPortable() && !Portable.IsHardwareEnabled()); // Initialise the Engine HandBrakeWPF.Helpers.LogManager.Init(); try { HandBrakeInstanceManager.Init(noHardware); } catch (Exception) { if (!noHardware) { MessageBox.Show(HandBrakeWPF.Properties.Resources.Startup_InitFailed, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); } throw; } // Initialise the GUI base.OnStartup(e); // If we have a file dropped on the icon, try scanning it. string[] args = e.Args; if (args.Any() && (File.Exists(args[0]) || Directory.Exists(args[0]))) { IMainViewModel mvm = IoC.Get <IMainViewModel>(); mvm.StartScan(args[0], 0); } }
/// <summary> /// Start with a LibHb EncodeJob Object /// </summary> /// <param name="job"> /// The job. /// </param> public void Start(QueueTask job) { // Setup this.startTime = DateTime.Now; this.currentTask = job; // Create a new HandBrake instance // Setup the HandBrake Instance HandBrakeUtils.MessageLogged += this.HandBrakeInstanceMessageLogged; HandBrakeUtils.ErrorLogged += this.HandBrakeInstanceErrorLogged; this.instance = HandBrakeInstanceManager.GetEncodeInstance(job.Configuration.Verbosity); this.instance.EncodeCompleted += this.InstanceEncodeCompleted; this.instance.EncodeProgress += this.InstanceEncodeProgress; try { // Sanity Checking and Setup if (this.IsEncoding) { throw new Exception("HandBrake is already encoding."); } this.IsEncoding = true; // Enable logging if required. try { this.SetupLogging(job, true); } catch (Exception) { this.IsEncoding = false; throw; } // Verify the Destination Path Exists, and if not, create it. this.VerifyEncodeDestinationPath(job); // We have to scan the source again but only the title so the HandBrake instance is initialised correctly. // Since the UI sends the crop params down, we don't have to do all the previews. this.instance.ScanCompleted += delegate { // Process into internal structures. this.scannedSource = new Source { Titles = LibScan.ConvertTitles(this.instance.Titles, this.instance.FeatureTitle) }; // TODO work around the bad Internal API. this.ScanCompleted(job, this.instance); }; HandBrakeUtils.SetDvdNav(!job.Configuration.IsDvdNavDisabled); ServiceLogMessage("Scanning title for encoding ... "); this.instance.StartScan(job.ScannedSourcePath, job.Configuration.PreviewScanCount, TimeSpan.FromSeconds(job.Configuration.MinScanDuration), job.Task.Title); } catch (Exception exc) { ServiceLogMessage("Scan Failed ... " + Environment.NewLine + exc); this.InvokeEncodeCompleted(new EventArgs.EncodeCompletedEventArgs(false, exc, "An Error has occured.", this.currentTask.Task.Destination)); } }
/// <summary> /// Start with a LibHb EncodeJob Object /// </summary> /// <param name="task"> /// The task. /// </param> /// <param name="configuration"> /// The configuration. /// </param> public void Start(EncodeTask task, HBConfiguration configuration) { try { // Setup this.startTime = DateTime.Now; this.currentTask = task; this.currentConfiguration = configuration; // Create a new HandBrake instance // Setup the HandBrake Instance HandBrakeUtils.MessageLogged += this.HandBrakeInstanceMessageLogged; HandBrakeUtils.ErrorLogged += this.HandBrakeInstanceErrorLogged; this.instance = HandBrakeInstanceManager.GetEncodeInstance(configuration.Verbosity); this.instance.EncodeCompleted += this.InstanceEncodeCompleted; this.instance.EncodeProgress += this.InstanceEncodeProgress; // Sanity Checking and Setup if (this.IsEncoding) { throw new Exception("HandBrake is already encoding."); } this.IsEncoding = true; this.SetupLogging(); // Verify the Destination Path Exists, and if not, create it. this.VerifyEncodeDestinationPath(task); this.ServiceLogMessage("Starting Encode ..."); // Get an EncodeJob object for the Interop Library this.instance.StartEncode(EncodeFactory.Create(task, configuration)); // Fire the Encode Started Event this.InvokeEncodeStarted(System.EventArgs.Empty); // Set the Process Priority switch (configuration.ProcessPriority) { case "Realtime": Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; break; case "High": Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; break; case "Above Normal": Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal; break; case "Normal": Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Normal; break; case "Low": Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle; break; default: Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; break; } } catch (Exception exc) { this.IsEncoding = false; this.ServiceLogMessage("Failed to start encoding ..." + Environment.NewLine + exc); this.InvokeEncodeCompleted(new HandBrakeWPF.Services.Encode.EventArgs.EncodeCompletedEventArgs(false, exc, "Unable to start encoding", task.Source)); } }
/// <summary> /// Override the startup behavior to handle files dropped on the app icon. /// </summary> /// <param name="e"> /// The StartupEventArgs. /// </param> protected override void OnStartup(StartupEventArgs e) { // We don't support Windows earlier than 10. if (!SystemInfo.IsWindows10OrLater()) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsVersionWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (!Environment.Is64BitOperatingSystem) { MessageBox.Show(HandBrakeWPF.Properties.Resources.OsBitnessWarning, HandBrakeWPF.Properties.Resources.Warning, MessageBoxButton.OK, MessageBoxImage.Warning); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.Equals("--reset"))) { HandBrakeApp.ResetToDefaults(); Application.Current.Shutdown(); return; } if (e.Args.Any(f => f.StartsWith("--recover-queue-ids"))) { string command = e.Args.FirstOrDefault(f => f.StartsWith("--recover-queue-ids")); if (!string.IsNullOrEmpty(command)) { command = command.Replace("--recover-queue-ids=", string.Empty); List <string> processIds = command.Split(',').ToList(); StartupOptions.QueueRecoveryIds = processIds; } } if (e.Args.Any(f => f.Equals("--auto-start-queue"))) { StartupOptions.AutoRestartQueue = true; } // Portable Mode if (Portable.IsPortable()) { int portableInit = Portable.Initialise(); if (portableInit != 0) { switch (portableInit) { case -1: MessageBox.Show( HandBrakeWPF.Properties.Resources.Portable_IniFileError, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); break; case -2: MessageBox.Show( HandBrakeWPF.Properties.Resources.Portable_TmpNotWritable, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); break; case -3: MessageBox.Show( HandBrakeWPF.Properties.Resources.Portable_StorageNotWritable, HandBrakeWPF.Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error); break; } Application.Current.Shutdown(); return; } } // Setup the UI Language IUserSettingService userSettingService = IoC.Get <IUserSettingService>(); string culture = userSettingService.GetUserSetting <string>(UserSettingConstants.UiLanguage); if (!string.IsNullOrEmpty(culture)) { InterfaceLanguage language = InterfaceLanguageUtilities.FindInterfaceLanguage(culture); if (language != null) { CultureInfo ci = new CultureInfo(language.Culture); Thread.CurrentThread.CurrentUICulture = ci; } } int runCounter = userSettingService.GetUserSetting <int>(UserSettingConstants.RunCounter); // Software Rendering if (e.Args.Any(f => f.Equals("--force-software-rendering")) || Portable.IsForcingSoftwareRendering() || userSettingService.GetUserSetting <bool>(UserSettingConstants.ForceSoftwareRendering)) { RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; } // Check if the user would like to check for updates AFTER the first run, but only once. if (runCounter == 1) { CheckForUpdateCheckPermission(userSettingService); } // Increment the counter so we can change startup behavior for the above warning and update check question. userSettingService.SetUserSetting(UserSettingConstants.RunCounter, runCounter + 1); // Only display once. // App Theme DarkThemeMode useDarkTheme = (DarkThemeMode)userSettingService.GetUserSetting <int>(UserSettingConstants.DarkThemeMode); ResourceDictionary dark = new ResourceDictionary { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Themes/Dark.Blue.xaml") }; ResourceDictionary light = new ResourceDictionary { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml") }; Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Themes/Generic.xaml", UriKind.Relative) }); bool themed = false; if (SystemParameters.HighContrast) { Application.Current.Resources["Ui.Light"] = new SolidColorBrush(SystemColors.HighlightTextColor); Application.Current.Resources["Ui.ContrastLight"] = new SolidColorBrush(SystemColors.ActiveBorderBrush.Color); useDarkTheme = DarkThemeMode.None; } switch (useDarkTheme) { case DarkThemeMode.System: if (SystemInfo.IsAppsUsingDarkTheme()) { Application.Current.Resources.MergedDictionaries.Add(dark); Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Themes/Dark.xaml", UriKind.Relative) }); } else { Application.Current.Resources.MergedDictionaries.Add(light); Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Themes/Light.xaml", UriKind.Relative) }); } themed = true; break; case DarkThemeMode.Dark: Application.Current.Resources.MergedDictionaries.Add(dark); Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Themes/Dark.xaml", UriKind.Relative) }); themed = true; break; case DarkThemeMode.Light: Application.Current.Resources.MergedDictionaries.Add(light); Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Themes/Light.xaml", UriKind.Relative) }); themed = true; break; case DarkThemeMode.None: Application.Current.Resources["Ui.Light"] = new SolidColorBrush(SystemColors.HighlightTextColor); Application.Current.Resources["Ui.ContrastLight"] = new SolidColorBrush(SystemColors.ActiveBorderBrush.Color); themed = false; break; } Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Views/Styles/Styles.xaml", UriKind.Relative) }); if (themed) { Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("Views/Styles/ThemedStyles.xaml", UriKind.Relative) }); } // NO-Hardware Mode bool noHardware = e.Args.Any(f => f.Equals("--no-hardware")) || (Portable.IsPortable() && !Portable.IsHardwareEnabled()); // Initialise the Engine Services.Logging.GlobalLoggingManager.Init(); HandBrakeInstanceManager.Init(noHardware, userSettingService); // Initialise the GUI base.OnStartup(e); // If we have a file dropped on the icon, try scanning it. string[] args = e.Args; if (args.Any() && (File.Exists(args[0]) || Directory.Exists(args[0]))) { IMainViewModel mvm = IoC.Get <IMainViewModel>(); mvm.StartScan(args[0], 0); } }