跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

浏览文件

App.xaml.cs

180 行 · 5.9 KB历史下载
1using Core;
2using Core.Librarys;
3using Core.Librarys.SQLite;
4using Core.Servicers.Instances;
5using Core.Servicers.Interfaces;
6using Microsoft.Extensions.DependencyInjection;
7using System;
8using System.Collections.Generic;
9using System.Configuration;
10using System.Data;
11using System.Diagnostics;
12using System.Drawing;
13using System.IO;
14using System.Linq;
15using System.Threading.Tasks;
16using System.Windows;
17using System.Windows.Controls;
18using System.Windows.Resources;
19using UI.Controls.Window;
20using UI.Servicers;
21using UI.ViewModels;
22using UI.Views;
23
24namespace UI
25{
26 /// <summary>
27 /// App.xaml 的交互逻辑
28 /// </summary>
29 public partial class App : Application
30 {
31 private readonly ServiceProvider serviceProvider;
32 private System.Threading.Mutex mutex;
33 // 保活窗口
34 private HideWindow keepaliveWindow;
35
36 public App()
37 {
38 DispatcherUnhandledException += App_DispatcherUnhandledException;
39
40#if DEBUG
41 DispatcherUnhandledException -= App_DispatcherUnhandledException;
42
43#endif
44
45 var serviceCollection = new ServiceCollection();
46 ConfigureServices(serviceCollection);
47 serviceProvider = serviceCollection.BuildServiceProvider();
48 }
49
50 protected override void OnExit(ExitEventArgs e)
51 {
52 base.OnExit(e);
53 Logger.Save(true);
54 }
55 private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
56 {
57 e.Handled = true;
58
59 // 记录崩溃错误
60 Logger.Error("[程序崩溃异常] " + e.Exception.ToString());
61 Logger.Save(true);
62
63 // 显示崩溃弹窗
64 string taiBugPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
65 "TaiBug.exe");
66 ProcessHelper.Run(taiBugPath, new string[] { string.Empty });
67
68 // 退出程序
69 Shutdown();
70 }
71
72 #region 获取当前程序是否已运行
73 /// <summary>
74 /// 获取当前程序是否已运行
75 /// </summary>
76 private bool IsRuned()
77 {
78 bool ret;
79 mutex = new System.Threading.Mutex(true, System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name, out ret);
80 if (!ret)
81 {
82#if !DEBUG
83 return true;
84
85#endif
86 }
87 return false;
88 }
89 #endregion
90
91 private void ConfigureServices(IServiceCollection services)
92 {
93 // 核心服务
94 services.AddSingleton<IDatabase, Database>();
95 services.AddSingleton<IAppManager, AppManager>();
96 services.AddSingleton<IWindowManager, WindowManager>();
97 services.AddSingleton<IAppTimerServicer, AppTimerServicer>();
98 services.AddSingleton<IAppObserver, AppObserver>();
99 services.AddSingleton<IWebServer, WebServer>();
100 services.AddSingleton<IMain, Main>();
101 services.AddSingleton<IData, Data>();
102 services.AddSingleton<IWebData, WebData>();
103 services.AddSingleton<ISleepdiscover, Sleepdiscover>();
104 services.AddSingleton<IAppConfig, AppConfig>();
105 services.AddSingleton<IDateTimeObserver, DateTimeObserver>();
106 services.AddSingleton<IAppData, AppData>();
107 services.AddSingleton<ICategorys, Categorys>();
108 services.AddSingleton<IWebFilter, WebFilter>();
109
110 // UI服务
111 services.AddSingleton<IUIServicer, UIServicer>();
112 services.AddSingleton<IAppContextMenuServicer, AppContextMenuServicer>();
113 services.AddSingleton<IThemeServicer, ThemeServicer>();
114 services.AddSingleton<IMainServicer, MainServicer>();
115 services.AddSingleton<IInputServicer, InputServicer>();
116 services.AddSingleton<IWebSiteContextMenuServicer, WebSiteContextMenuServicer>();
117 services.AddSingleton<IStatusBarIconServicer, StatusBarIconServicer>();
118
119 // 主窗口
120 services.AddSingleton<MainViewModel>();
121
122 // 首页
123 services.AddTransient<IndexPage>();
124 services.AddTransient<IndexPageVM>();
125
126 // 数据页
127 services.AddTransient<DataPage>();
128 services.AddTransient<DataPageVM>();
129
130 // 设置页
131 services.AddTransient<SettingPage>();
132 services.AddTransient<SettingPageVM>();
133
134 // 详情页
135 services.AddTransient<DetailPage>();
136 services.AddTransient<DetailPageVM>();
137
138 // 分类
139 services.AddTransient<CategoryPage>();
140 services.AddTransient<CategoryPageVM>();
141
142 // 分类app
143 services.AddTransient<CategoryAppListPage>();
144 services.AddTransient<CategoryAppListPageVM>();
145 // 分类站点
146 services.AddTransient<CategoryWebSiteListPage>();
147 services.AddTransient<CategoryWebSiteListPageVM>();
148 // 图表
149 services.AddTransient<ChartPage>();
150 services.AddTransient<ChartPageVM>();
151 // 网站详情
152 services.AddTransient<WebSiteDetailPage>();
153 services.AddTransient<WebSiteDetailPageVM>();
154 }
155
156 private void OnStartup(object sender, StartupEventArgs e)
157 {
158 // 阻止多开进程
159 if (IsRuned())
160 {
161 Shutdown();
162 }
163
164 var main = serviceProvider.GetService<IMainServicer>();
165
166 bool isSelfStart = false;
167 if (e.Args.Length != 0)
168 {
169 if (e.Args[0].Equals("--selfStart"))
170 {
171 isSelfStart = true;
172 }
173 }
174 main.Start(isSelfStart);
175
176 // 创建保活窗口
177 keepaliveWindow = new HideWindow();
178 }
179 }
180}