public static int Run(string[] args) { if (args.Length == 0) { args = new[] { "-h" } } ; // https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2019/march/net-parse-the-command-line-with-system-commandline var rootCommand = new RootCommand("命令行工具(Command Line Tools/CLT)"); void MainHandler() => MainHandler_(null); void MainHandler_(Action?onInitStartuped) { #if StartupTrace StartupTrace.Restart("ProcessCheck"); #endif Startup.Init(IsMainProcess ? DILevel.MainProcess : DILevel.Min); #if StartupTrace StartupTrace.Restart("Startup.Init"); #endif onInitStartuped?.Invoke(); if (IsMainProcess) { var isInitAppInstanceReset = false; initAppInstance : appInstance = new(); if (!appInstance.IsFirst) { //Console.WriteLine("ApplicationInstance.SendMessage(string.Empty);"); if (IApplication.SingletonInstance.SendMessage(string.Empty)) { return; } else { if (!isInitAppInstanceReset && IApplication.SingletonInstance.TryKillCurrentAllProcess()) { isInitAppInstanceReset = true; appInstance.Dispose(); goto initAppInstance; } else { return; } } } appInstance.MessageReceived += value => { if (string.IsNullOrEmpty(value)) { var app = App.Instance; if (app != null) { MainThread2.BeginInvokeOnMainThread(app.RestoreMainWindow); } } }; } //#if StartupTrace // StartupTrace.Restart("ApplicationInstance"); //#endif // initCef(); //#if StartupTrace // StartupTrace.Restart("InitCefNetApp"); //#endif if (IsMainProcess) { BuildAvaloniaAppAndStartWithClassicDesktopLifetime(args); } #if StartupTrace StartupTrace.Restart("InitAvaloniaApp"); #endif } void MainHandlerByCLT() => MainHandlerByCLT_(null); void MainHandlerByCLT_(Action?onInitStartuped) { IsMainProcess = true; IsCLTProcess = false; MainHandler_(onInitStartuped); } #if DEBUG // -clt debug -args 730 var debug = new Command("debug", "调试"); debug.AddOption(new Option <string>("-args", () => "", "测试参数")); debug.Handler = CommandHandler.Create((string args) => // 参数名与类型要与 Option 中一致! { //Console.WriteLine("-clt debug -args " + args); // OutputType WinExe 导致控制台输入不会显示,只能附加一个新的控制台窗口显示内容,不合适 // 如果能取消 管理员权限要求,改为运行时管理员权限, // 则可尝试通过 Windows Terminal 或直接 Host 进行命令行模式 MainHandlerByCLT(); }); rootCommand.AddCommand(debug); #endif var main = new Command(command_main) { Handler = CommandHandler.Create(MainHandler) }; rootCommand.AddCommand(main); // -clt devtools // -clt devtools -disable_gpu // -clt devtools -use_wgl var devtools = new Command("devtools"); devtools.AddOption(new Option <bool>("-disable_gpu", () => false, "禁用 GPU 硬件加速")); devtools.AddOption(new Option <bool>("-use_wgl", () => false, "使用 Native OpenGL(仅 Windows)")); devtools.Handler = CommandHandler.Create((bool disable_gpu, bool use_wgl) => { IApplication.EnableDevtools = true; IApplication.DisableGPU = disable_gpu; IApplication.UseWgl = use_wgl; MainHandlerByCLT_(onInitStartuped: () => { IApplication.LoggerMinLevel = LogLevel.Debug; }); }); rootCommand.AddCommand(devtools); // -clt c -silence var common = new Command("c", "common"); common.AddOption(new Option <bool>("-silence", "静默启动(不弹窗口)")); common.Handler = CommandHandler.Create((bool silence) => { IsMinimize = silence; MainHandlerByCLT(); }); rootCommand.AddCommand(common); // -clt steam -account var steamuser = new Command("steam", "Steam相关操作"); steamuser.AddOption(new Option <string>("-account", "指定对应steam用户名")); steamuser.Handler = CommandHandler.Create((string account) => { if (!string.IsNullOrEmpty(account)) { Startup.Init(DILevel.Steam); ISteamService.Instance.TryKillSteamProcess(); ISteamService.Instance.SetCurrentUser(account); ISteamService.Instance.StartSteam(); } }); rootCommand.AddCommand(steamuser); // -clt app -id 632360 var unlock_achievement = new Command("app", "打开成就解锁窗口"); unlock_achievement.AddOption(new Option <int>("-id", "指定一个Steam游戏Id")); unlock_achievement.AddOption(new Option <bool>("-silence", "挂运行服务,不加载窗口,内存占用更小")); unlock_achievement.Handler = CommandHandler.Create(async(int id, bool silence) => { try { if (id <= 0) { return; } if (!silence) { Startup.Init(DILevel.GUI | DILevel.Steam | DILevel.HttpClientFactory); IViewModelManager.Instance.InitUnlockAchievement(id); BuildAvaloniaAppAndStartWithClassicDesktopLifetime(args); } else { Startup.Init(DILevel.Steam); SteamConnectService.Current.Initialize(id); TaskCompletionSource tcs = new(); await tcs.Task; } } catch (Exception ex) { Log.Error(nameof(unlock_achievement), ex, "Start"); } }); rootCommand.AddCommand(unlock_achievement); var r = rootCommand.InvokeAsync(args).Result; return(r); } }
public override async void Initialize() { var list = steamService.GetRememberUserList(); if (!list.Any_Nullable()) { return; } _SteamUsersSourceList.AddOrUpdate(list); RefreshRememberUserList(); #region 加载备注信息 IReadOnlyDictionary <long, string?>?accountRemarks = SteamAccountSettings.AccountRemarks.Value; MenuItems = new ObservableCollection <MenuItemViewModel>(); List <(string title, string applicationPath, string iconResourcePath, string arguments, string description, string customCategory)>?jumplistData = OperatingSystem2.IsWindows ? new() : null; foreach (var user in _SteamUsersSourceList.Items) { if (accountRemarks?.TryGetValue(user.SteamId64, out var remark) == true && !string.IsNullOrEmpty(remark)) { user.Remark = remark; } if (OperatingSystem2.IsWindows) { var title = user.SteamNickName ?? user.SteamId64.ToString(CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(user.Remark)) { title = user.SteamNickName + "(" + user.Remark + ")"; } MenuItems.Add(new MenuItemCustomName(title, AppResources.UserChange_BtnTootlip) { Command = ReactiveCommand.Create(() => { SteamId_Click(user); INotificationService.Instance.Notify(string.Format(AppResources.UserChange_ChangeUserTip, title), NotificationType.Message); }), }); if (!string.IsNullOrEmpty(user.AccountName)) { jumplistData !.Add(( title: title, applicationPath: IApplication.ProgramPath, iconResourcePath: IApplication.ProgramPath, arguments: $"-clt steam -account {user.AccountName}", description: AppResources.UserChange_BtnTootlip, customCategory: Name)); } } } if (jumplistData.Any_Nullable()) { MainThread2.BeginInvokeOnMainThread(async() => { var s = IJumpListService.Instance; await s.AddJumpItemsAsync(jumplistData); }); } _SteamUsersSourceList.Refresh(); #endregion #region 通过webapi加载头像图片用户信息 foreach (var user in _SteamUsersSourceList.Items) { var temp = await webApiService.GetUserInfo(user.SteamId64); if (!string.IsNullOrEmpty(temp.SteamID)) { user.SteamID = temp.SteamID; user.OnlineState = temp.OnlineState; user.MemberSince = temp.MemberSince; user.VacBanned = temp.VacBanned; user.Summary = temp.Summary; user.PrivacyState = temp.PrivacyState; user.AvatarIcon = temp.AvatarIcon; user.AvatarMedium = temp.AvatarMedium; user.AvatarFull = temp.AvatarFull; user.MiniProfile = temp.MiniProfile; if (user.MiniProfile != null && !string.IsNullOrEmpty(user.MiniProfile.AnimatedAvatar)) { user.AvatarStream = httpService.GetImageAsync(user.MiniProfile.AnimatedAvatar, ImageChannelType.SteamAvatars); } else { user.AvatarStream = httpService.GetImageAsync(temp.AvatarFull, ImageChannelType.SteamAvatars); } } } _SteamUsersSourceList.Refresh(); #endregion #region 加载动态头像头像框数据 //foreach (var item in _SteamUsersSourceList.Items) //{ // item.MiniProfile = await webApiService.GetUserMiniProfile(item.SteamId3_Int); // var miniProfile = item.MiniProfile; // if (miniProfile != null) // { // if (!string.IsNullOrEmpty(miniProfile.AnimatedAvatar)) // item.AvatarStream = httpService.GetImageAsync(miniProfile.AnimatedAvatar, ImageChannelType.SteamAvatars); // if (!string.IsNullOrEmpty(miniProfile.AvatarFrame)) // miniProfile.AvatarFrameStream = httpService.GetImageAsync(miniProfile.AvatarFrame, ImageChannelType.SteamAvatars); // //item.Level = miniProfile.Level; // } //} //_SteamUsersSourceList.Refresh(); #endregion }
/// <summary> /// 当接收到 WebSocket Client 发送的消息时 /// </summary> /// <param name="host"></param> /// <param name="msg"></param> /// <param name="socket"></param> /// <returns></returns> static async Task OnMessage(string msg, IWebSocketConnection?socket) { if (tempAes == null) { return; } var byteArray = msg.Base64UrlDecodeToByteArray(); try { byteArray = tempAes.Decrypt(byteArray); } catch { if (socket == null) { Toast.Show(AppResources.Login_WebSocketOnMessage); } return; } var rsp = ApiResponse.Deserialize <LoginOrRegisterResponse>(byteArray); var webRsp = new WebResponseDTO(); if (rsp.IsSuccess && rsp.Content == null) { webRsp.Msg = ApiResponse.GetMessage(ApiResponseCode.NoResponseContent); if (socket != null) { await socket.Send(JsonSerializer.Serialize(webRsp)); } else { Toast.Show(webRsp.Msg); } return; } var conn_helper = DI.Get <IApiConnectionPlatformHelper>(); webRsp.State = rsp.IsSuccess; if (socket != null) { await socket.Send(JsonSerializer.Serialize(webRsp)); // 仅可在 close 之前传递消息 } else { Toast.Show(webRsp.Msg); } if (rsp.IsSuccess) { if (isBind) { var chan = rsp.Content?.FastLRBChannel; if (!chan.HasValue) { return; } await MainThread2.InvokeOnMainThreadAsync(async() => { string msg; if (chan.HasValue) { msg = AppResources.Success_.Format(AppResources.User_AccountBind); await UserService.Current. BindAccountAfterUpdateAsync(chan.Value, rsp.Content !); if (vm is IBindWindowViewModel vm2) { vm2.OnBindSuccessed(); } } else { msg = "Account bind fail, unknown channel."; } Toast.Show(msg); }); } else { await conn_helper.OnLoginedAsync(rsp.Content !, rsp.Content !); await MainThread2.InvokeOnMainThreadAsync(async() => { await LoginOrRegisterWindowViewModel. SuccessAsync(rsp.Content !, () => vm?.Close()); }); } } else { await MainThread2.InvokeOnMainThreadAsync(() => { vm?.Close(); conn_helper.ShowResponseErrorMessage(rsp); }); } }
public void SetLightOrDarkThemeFollowingSystem(bool enable) { var major = Environment.OSVersion.Version.Major; if (major < 10 || (major == 10 && Environment.OSVersion.Version.Build < 18282)) { return; } var currentUser = WindowsIdentity.GetCurrent()?.User; if (currentUser == null) { return; } try { if (enable) { if (isLightOrDarkThemeWatch == null) { var queryStr_ = @"SELECT * FROM RegistryValueChangeEvent WHERE Hive = 'HKEY_USERS' AND KeyPath = '{0}\\{1}' AND ValueName = '{2}'"; var queryStr = string.Format( queryStr_, currentUser.Value, Themes_Personalize.Replace(@"\", @"\\"), AppsUseLightTheme); isLightOrDarkThemeWatch = new ManagementEventWatcher(queryStr); isLightOrDarkThemeWatch.EventArrived += (_, _) => { var value = IsLightOrDarkTheme; if (value.HasValue) { var app = IApplication.Instance; var theme_value = value.Value ? AppTheme.Light : AppTheme.Dark; MainThread2.BeginInvokeOnMainThread(() => { IApplication.Instance.SetThemeNotChangeValue(theme_value); }); } }; } isLightOrDarkThemeWatch.Start(); } else { if (isLightOrDarkThemeWatch == null) { return; } else { isLightOrDarkThemeWatch.Stop(); } } } catch { } }
protected override void BeginInvokeOnMainThread(Action action) => MainThread2.BeginInvokeOnMainThread(action);