Skip to content

Commit e6a8728

Browse files
committed
add tools button: exclude editor folders from windows defender, add context menu: exclude project from defender fixes #87, clear(set) statusbar when enable streamer mode,
1 parent 24a1c59 commit e6a8728

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

UnityLauncherPro/MainWindow.xaml

+6
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@
228228
<MenuItem x:Name="menuBatchBuildAndroid" Header="Android" Click="MenuBatchBuildAndroid_Click"/>
229229
<MenuItem x:Name="menuBatchBuildIOS" Header="IOS" Click="MenuBatchBuildIOS_Click"/>
230230
</MenuItem>
231+
<MenuItem Header="Tools">
232+
<MenuItem x:Name="menuExcludeFromDefender" Header="Exclude Path From Defender" Click="menuExcludeFromDefender_Click"/>
233+
</MenuItem>
231234
<Separator/>
232235
<MenuItem x:Name="menuRemoveProject" Header="Remove from recent list" Click="MenuRemoveProject_Click" />
233236
<!--<MenuItem x:Name="menuProjectProperties" Header="Properties..." Click="menuProjectProperties_Click" />-->
@@ -598,6 +601,9 @@
598601
<Button Style="{StaticResource CustomButton}" x:Name="btnOpenADBLogCat" Margin="10,0,0,0" BorderBrush="{x:Null}" HorizontalAlignment="Left" VerticalAlignment="Top" Click="BtnOpenADBLogCat_Click" ToolTip="Start ADB logcat commandline">
599602
<Label Content="_ADB logcat" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}}" />
600603
</Button>
604+
<Button Style="{StaticResource CustomButton}" x:Name="btnExcludeFolderForDefender" Margin="10,0,0,0" BorderBrush="{x:Null}" HorizontalAlignment="Left" VerticalAlignment="Top" ToolTip="Exclude all Editor folders from Windows Defender" Click="btnExcludeFolderForDefender_Click">
605+
<Label Content="Exclude Folders*" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}}" />
606+
</Button>
601607
</StackPanel>
602608
</Border>
603609
<!-- links -->

UnityLauncherPro/MainWindow.xaml.cs

+36
Original file line numberDiff line numberDiff line change
@@ -2187,6 +2187,8 @@ private void ChkStreamerMode_Checked(object sender, RoutedEventArgs e)
21872187
{
21882188
RefreshRecentProjects();
21892189
}
2190+
2191+
SetStatus("Streamer mode " + (isChecked ? "enabled" : "disabled"), MessageType.Info);
21902192
}
21912193

21922194
private void ChkShowPlatform_Checked(object sender, RoutedEventArgs e)
@@ -4030,7 +4032,41 @@ private void chkRegisterInstallAPKMenu_Checked(object sender, RoutedEventArgs e)
40304032

40314033
}
40324034

4035+
private void btnExcludeFolderForDefender_Click(object sender, RoutedEventArgs e)
4036+
{
4037+
var foldersToExclude = new List<string>();
4038+
foreach (var unity in unityInstallationsSource)
4039+
{
4040+
var unityEditorFolder = Path.GetDirectoryName(unity.Path);
4041+
//Console.WriteLine(unityEditorFolder);
4042+
if (Directory.Exists(unityEditorFolder))
4043+
{
4044+
foldersToExclude.Add(unityEditorFolder);
4045+
}
4046+
}
4047+
4048+
Tools.RunExclusionElevated(foldersToExclude);
4049+
}
40334050

4051+
private void menuExcludeFromDefender_Click(object sender, RoutedEventArgs e)
4052+
{
4053+
var proj = GetSelectedProject();
4054+
if (proj == null) return;
4055+
if (Directory.Exists(proj.Path) == false) return;
4056+
4057+
var foldersToExclude = new List<string>();
4058+
foldersToExclude.Add(proj.Path);
4059+
var res = Tools.RunExclusionElevated(foldersToExclude, silent: true);
4060+
var tempPath = ((chkStreamerMode.IsChecked == true) ? "***" : proj.Path);
4061+
if (res == false)
4062+
{
4063+
SetStatus("Failed to add exclusion for: " + tempPath);
4064+
}
4065+
else
4066+
{
4067+
SetStatus("Added exclusion for project path: " + tempPath);
4068+
}
4069+
}
40344070

40354071
//private void menuProjectProperties_Click(object sender, RoutedEventArgs e)
40364072
//{

UnityLauncherPro/Tools.cs

+60
Original file line numberDiff line numberDiff line change
@@ -2696,6 +2696,66 @@ internal static void InstallAPK(string ApkPath)
26962696
}
26972697
}
26982698

2699+
// exclude folders from windows defender
2700+
internal static bool RunExclusionElevated(IEnumerable<string> paths, bool silent = false)
2701+
{
2702+
var escapedPaths = new List<string>();
2703+
foreach (var rawPath in paths)
2704+
{
2705+
var path = rawPath.Trim();
2706+
string safePath = path.Replace("'", "''");
2707+
escapedPaths.Add($"'{safePath}'");
2708+
}
2709+
2710+
string joinedPaths = string.Join(", ", escapedPaths);
2711+
string psCommand = $"Add-MpPreference -ExclusionPath {joinedPaths}";
2712+
2713+
string fullCommand;
2714+
2715+
if (silent)
2716+
{
2717+
// No output, just run the command silently
2718+
fullCommand = psCommand;
2719+
}
2720+
else
2721+
{
2722+
// Show command and keep window open
2723+
var quotedPathsForDisplay = string.Join(", ", escapedPaths.ConvertAll(p => $"'{p.Trim('\'')}'"));
2724+
string displayCommand = $"Add-MpPreference -ExclusionPath {quotedPathsForDisplay}";
2725+
fullCommand = $"Write-Host 'Running: {displayCommand}'; {psCommand}; Write-Host ''; Write-Host 'Done. Press any key to exit...'; pause";
2726+
}
2727+
2728+
var startInfo = new ProcessStartInfo
2729+
{
2730+
FileName = "powershell.exe",
2731+
Arguments = silent
2732+
? $"-WindowStyle Hidden -Command \"{fullCommand}\""
2733+
: $"-NoExit -Command \"{fullCommand}\"",
2734+
UseShellExecute = true,
2735+
Verb = "runas", // Requires admin rights
2736+
WindowStyle = silent ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal
2737+
};
2738+
2739+
try
2740+
{
2741+
Process.Start(startInfo);
2742+
}
2743+
catch (Win32Exception)
2744+
{
2745+
if (!silent)
2746+
{
2747+
MessageBox.Show("Operation cancelled or failed due to insufficient privileges.", "Cancelled", MessageBoxButton.OK, MessageBoxImage.Warning);
2748+
}
2749+
return false;
2750+
}
2751+
2752+
return true;
2753+
}
2754+
2755+
2756+
2757+
2758+
26992759

27002760

27012761
} // class

0 commit comments

Comments
 (0)