跳到主要内容

github/tai

公开

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

提交记录
修改Core/Servicers/Instances/AppObserver.cs+2 −0看文件
@@ -89,6 +89,8 @@ namespace Core.Servicers.Instances
8989 int titleCapacity = Win32API.GetWindowTextLength(hwnd) * 2;
9090 StringBuilder stringBuilder = new StringBuilder(titleCapacity);
9191 Win32API.GetWindowText(hwnd, stringBuilder, stringBuilder.Capacity);
92新增:
93新增:
9294 if (IsSystemProcess(processName, stringBuilder.ToString()))
9395 {
9496 // 过滤掉一些系统进程
修改UI/App.xaml.cs+5 −145看文件
@@ -30,26 +30,11 @@ namespace UI
3030 {
3131 private readonly ServiceProvider serviceProvider;
3232 private System.Threading.Mutex mutex;
33删除:
34删除: // 状态栏图标
35删除: private System.Windows.Forms.NotifyIcon statusBarIcon;
36删除:
3733 // 保活窗口
3834 private HideWindow keepaliveWindow;
3935
40删除: // 状态栏图标菜单
41删除: private ContextMenu contextMenu;
42删除:
43删除: private DefaultWindow mainWindow;
44删除:
45删除: private IAppData appData;
46删除:
4736 public App()
4837 {
49删除: InitStatusBarIcon();
50删除:
51删除: WatchStatus();
52删除:
5338 DispatcherUnhandledException += App_DispatcherUnhandledException;
5439
5540#if DEBUG
@@ -65,31 +50,23 @@ namespace UI
6550 protected override void OnExit(ExitEventArgs e)
6651 {
6752 base.OnExit(e);
68删除:
69删除:
70删除: //appData.SaveAppChanges();
71删除:
7253 Logger.Save(true);
73删除:
74删除: statusBarIcon.Visible = false;
7554 }
7655 private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
7756 {
78删除: //appData.SaveAppChanges();
57新增: e.Handled = true;
7958
8059 // 记录崩溃错误
8160 Logger.Error("[程序崩溃异常] " + e.Exception.ToString());
82删除:
8361 Logger.Save(true);
8462
85删除: e.Handled = true;
86删除:
87删除: Shutdown();
88删除:
8963 // 显示崩溃弹窗
9064 string taiBugPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
9165 "TaiBug.exe");
9266 ProcessHelper.Run(taiBugPath, new string[] { string.Empty });
67新增:
68新增: // 退出程序
69新增: Shutdown();
9370 }
9471
9572 #region 获取当前程序是否已运行
@@ -111,74 +88,6 @@ namespace UI
11188 }
11289 #endregion
11390
114删除: #region 状态栏图标
115删除: /// <summary>
116删除: /// 初始化状态栏图标
117删除: /// </summary>
118删除: private void InitStatusBarIcon()
119删除: {
120删除: CreateStatusBarIconMenu();
121删除:
122删除: statusBarIcon = new System.Windows.Forms.NotifyIcon();
123删除: //statusBarIcon.Text = "Tai!";
124删除: Stream iconStream = GetResourceStream(new Uri("pack://application:,,,/Tai;component/Resources/Icons/taibusy.ico")).Stream;
125删除: statusBarIcon.Icon = new Icon(iconStream);
126删除: //statusBarIcon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetEntryAssembly().ManifestModule.Name);
127删除:
128删除: statusBarIcon.Visible = true;
129删除: statusBarIcon.MouseClick += NotifyIcon_MouseClick;
130删除: statusBarIcon.MouseDoubleClick += NotifyIcon_MouseDoubleClick;
131删除: }
132删除: private void NotifyIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
133删除: {
134删除: if (e.Button == System.Windows.Forms.MouseButtons.Right && !AppState.IsLoading)
135删除: {
136删除: //右键单击弹出托盘菜单
137删除: contextMenu.IsOpen = true;
138删除: }
139删除: }
140删除: private void NotifyIcon_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
141删除: {
142删除: if (e.Button == System.Windows.Forms.MouseButtons.Left && !AppState.IsLoading)
143删除: {
144删除: //双击托盘图标显示主窗口
145删除: ShowMainWindow();
146删除: }
147删除: }
148删除:
149删除: /// <summary>
150删除: /// 创建状态栏图标菜单
151删除: /// </summary>
152删除: private void CreateStatusBarIconMenu()
153删除: {
154删除: contextMenu = new ContextMenu();
155删除: App.Current.Deactivated += (e, c) =>
156删除: {
157删除: contextMenu.IsOpen = false;
158删除: };
159删除: var mainWindowMenuItem = new MenuItem();
160删除: mainWindowMenuItem.Header = "主界面";
161删除: mainWindowMenuItem.Click += MainWindowMenuItem_Click;
162删除: var exitMenuItem = new MenuItem();
163删除: exitMenuItem.Header = "退出";
164删除: exitMenuItem.Click += ExitMenuItem_Click; ;
165删除:
166删除: contextMenu.Items.Add(mainWindowMenuItem);
167删除: contextMenu.Items.Add(exitMenuItem);
168删除:
169删除: }
170删除:
171删除: private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
172删除: {
173删除: Shutdown();
174删除: }
175删除:
176删除: private void MainWindowMenuItem_Click(object sender, RoutedEventArgs e)
177删除: {
178删除: ShowMainWindow();
179删除: }
180删除: #endregion
181删除:
18291 private void ConfigureServices(IServiceCollection services)
18392 {
18493 // 核心服务
@@ -201,10 +110,10 @@ namespace UI
201110 services.AddSingleton<IMainServicer, MainServicer>();
202111 services.AddSingleton<IInputServicer, InputServicer>();
203112 services.AddSingleton<IWebSiteContextMenuServicer, WebSiteContextMenuServicer>();
113新增: services.AddSingleton<IStatusBarIconServicer, StatusBarIconServicer>();
204114
205115 // 主窗口
206116 services.AddSingleton<MainViewModel>();
207删除: services.AddTransient<MainWindow>();
208117
209118 // 首页
210119 services.AddTransient<IndexPage>();
@@ -251,57 +160,8 @@ namespace UI
251160 var main = serviceProvider.GetService<IMainServicer>();
252161 main.Start();
253162
254删除: var observer = serviceProvider.GetService<IAppObserver>();
255删除: observer.OnAppActive += (args) =>
256删除: {
257删除: Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, new Action(() =>
258删除: {
259删除: contextMenu.IsOpen = false;
260删除: }));
261删除: };
262删除:
263删除: var theme = serviceProvider.GetService<IThemeServicer>();
264删除: theme.OnThemeChanged += (a, c) =>
265删除: {
266删除: contextMenu.UpdateDefaultStyle();
267删除: };
268163 // 创建保活窗口
269164 keepaliveWindow = new HideWindow();
270165 }
271删除:
272删除:
273删除:
274删除: private void ShowMainWindow()
275删除: {
276删除: var dataContext = serviceProvider.GetService<MainViewModel>();
277删除:
278删除:
279删除: if (mainWindow == null || mainWindow.IsWindowClosed)
280删除: {
281删除: mainWindow = serviceProvider.GetService<MainWindow>();
282删除:
283删除: mainWindow.DataContext = dataContext;
284删除: dataContext.LoadDefaultPage();
285删除: }
286删除:
287删除: mainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
288删除: mainWindow.WindowState = WindowState.Normal;
289删除: mainWindow.Show();
290删除: mainWindow.Activate();
291删除: }
292删除:
293删除: private async void WatchStatus()
294删除: {
295删除: await Task.Run(() =>
296删除: {
297删除: while (AppState.IsLoading)
298删除: {
299删除: statusBarIcon.Text = $"[{AppState.ProcessValue}%] Tai [{AppState.ActionText}]";
300删除: }
301删除: statusBarIcon.Text = "Tai!";
302删除: Stream iconStream = GetResourceStream(new Uri("pack://application:,,,/Tai;component/Resources/Icons/tai32.ico")).Stream;
303删除: statusBarIcon.Icon = new Icon(iconStream);
304删除: });
305删除: }
306166 }
307167}
修改UI/MainWindow.xaml.cs+1 −12看文件
@@ -23,20 +23,9 @@ namespace UI
2323 /// </summary>
2424 public partial class MainWindow : DefaultWindow
2525 {
26删除: private readonly IThemeServicer themeServicer;
27删除: public MainWindow(IThemeServicer themeServicer)
26新增: public MainWindow()
2827 {
2928 InitializeComponent();
30删除: this.themeServicer = themeServicer;
31删除: themeServicer.SetMainWindow(this);
32删除: themeServicer.UpdateWindowStyle();
33删除: Unloaded += Page_Unloaded;
34删除: }
35删除:
36删除: private void Page_Unloaded(object sender, RoutedEventArgs e)
37删除: {
38删除: Unloaded -= Page_Unloaded;
39删除: DataContext = null;
4029 }
4130 }
4231}
新增UI/Servicers/IStatusBarIconServicer.cs+19 −0看文件
@@ -0,0 +1,19 @@
1新增:using System;
2新增:using System.Collections.Generic;
3新增:using System.Linq;
4新增:using System.Text;
5新增:using System.Threading.Tasks;
6新增:
7新增:namespace UI.Servicers
8新增:{
9新增: /// <summary>
10新增: /// 状态栏图标服务
11新增: /// </summary>
12新增: public interface IStatusBarIconServicer
13新增: {
14新增: /// <summary>
15新增: /// 初始化状态栏图标
16新增: /// </summary>
17新增: void Init();
18新增: }
19新增:}
修改UI/Servicers/MainServicer.cs+11 −1看文件
@@ -14,16 +14,26 @@ namespace UI.Servicers
1414 private readonly IInputServicer inputServicer;
1515 private readonly IAppContextMenuServicer appContextMenuServicer;
1616 private readonly IWebSiteContextMenuServicer _webSiteContext;
17删除: public MainServicer(IMain main, IThemeServicer themeServicer, IInputServicer inputServicer, IAppContextMenuServicer appContextMenuServicer, IWebSiteContextMenuServicer webSiteContext_)
17新增: private readonly IStatusBarIconServicer _statusBarIconServicer;
18新增: public MainServicer(
19新增: IMain main,
20新增: IThemeServicer themeServicer,
21新增: IInputServicer inputServicer,
22新增: IAppContextMenuServicer appContextMenuServicer,
23新增: IWebSiteContextMenuServicer webSiteContext_,
24新增: IStatusBarIconServicer statusBarIconServicer_)
1825 {
1926 this.main = main;
2027 this.themeServicer = themeServicer;
2128 this.inputServicer = inputServicer;
2229 this.appContextMenuServicer = appContextMenuServicer;
2330 _webSiteContext = webSiteContext_;
31新增: _statusBarIconServicer = statusBarIconServicer_;
2432 }
2533 public void Start()
2634 {
35新增: _statusBarIconServicer.Init();
36新增:
2737 main.OnStarted += Main_OnStarted;
2838 main.Run();
2939 }
新增UI/Servicers/StatusBarIconServicer.cs+215 −0看文件
@@ -0,0 +1,215 @@
1新增:using Core;
2新增:using Core.Librarys;
3新增:using Core.Servicers.Interfaces;
4新增:using System;
5新增:using System.Collections.Generic;
6新增:using System.Drawing;
7新增:using System.IO;
8新增:using System.Linq;
9新增:using System.Text;
10新增:using System.Threading.Tasks;
11新增:using System.Windows;
12新增:using System.Windows.Controls;
13新增:using System.Windows.Threading;
14新增:using UI.ViewModels;
15新增:
16新增:namespace UI.Servicers
17新增:{
18新增: public class StatusBarIconServicer : IStatusBarIconServicer
19新增: {
20新增: // 状态栏图标
21新增: private System.Windows.Forms.NotifyIcon _statusBarIcon;
22新增: // 状态栏图标菜单
23新增: private ContextMenu _contextMenu;
24新增:
25新增: /// <summary>
26新增: /// 图标类型
27新增: /// </summary>
28新增: public enum IconType
29新增: {
30新增: /// <summary>
31新增: /// 正常
32新增: /// </summary>
33新增: Normal,
34新增: /// <summary>
35新增: /// 繁忙中
36新增: /// </summary>
37新增: Busy
38新增: }
39新增:
40新增: private readonly IAppObserver _appObserver;
41新增: private readonly IThemeServicer _themeServicer;
42新增: private readonly MainViewModel _mainVM;
43新增: private MainWindow _mainWindow;
44新增: public StatusBarIconServicer(
45新增: IAppObserver appObserver_,
46新增: IThemeServicer themeServicer_,
47新增: MainViewModel mainVM_
48新增: )
49新增: {
50新增: _appObserver = appObserver_;
51新增: _themeServicer = themeServicer_;
52新增: _mainVM = mainVM_;
53新增: }
54新增: public void Init()
55新增: {
56新增: InitMenu();
57新增:
58新增: _statusBarIcon = new System.Windows.Forms.NotifyIcon();
59新增: _statusBarIcon.Visible = true;
60新增: _statusBarIcon.MouseClick += _statusBarIcon_MouseClick;
61新增: _statusBarIcon.MouseDoubleClick += _statusBarIcon_MouseDoubleClick;
62新增:
63新增: SetIcon(IconType.Busy);
64新增:
65新增: WatchStateAsync();
66新增:
67新增: _appObserver.OnAppActive += _appObserver_OnAppActive;
68新增: _themeServicer.OnThemeChanged += _themeServicer_OnThemeChanged;
69新增: Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
70新增: }
71新增:
72新增: private void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
73新增: {
74新增: _statusBarIcon.Visible = false;
75新增: Logger.Save(true);
76新增: }
77新增:
78新增: private void _themeServicer_OnThemeChanged(object sender, EventArgs e)
79新增: {
80新增: _contextMenu.UpdateDefaultStyle();
81新增: }
82新增:
83新增: private void _appObserver_OnAppActive(Core.Models.AppObserver.AppObserverEventArgs args)
84新增: {
85新增: Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
86新增: {
87新增: _contextMenu.IsOpen = false;
88新增: }));
89新增: }
90新增:
91新增: /// <summary>
92新增: /// 初始化状态栏菜单
93新增: /// </summary>
94新增: private void InitMenu()
95新增: {
96新增: _contextMenu = new ContextMenu();
97新增: App.Current.Deactivated += (e, c) =>
98新增: {
99新增: _contextMenu.IsOpen = false;
100新增: };
101新增: var mainWindowMenuItem = new MenuItem();
102新增: mainWindowMenuItem.Header = "主界面";
103新增: mainWindowMenuItem.Click += MainWindowMenuItem_Click; ;
104新增: var exitMenuItem = new MenuItem();
105新增: exitMenuItem.Header = "退出";
106新增: exitMenuItem.Click += ExitMenuItem_Click;
107新增:
108新增: _contextMenu.Items.Add(mainWindowMenuItem);
109新增: _contextMenu.Items.Add(exitMenuItem);
110新增:
111新增: }
112新增:
113新增: /// <summary>
114新增: /// 等待程序加载
115新增: /// </summary>
116新增: private async void WatchStateAsync()
117新增: {
118新增: await Task.Run(() =>
119新增: {
120新增: while (AppState.IsLoading)
121新增: {
122新增: _statusBarIcon.Text = $"[{AppState.ProcessValue}%] Tai [{AppState.ActionText}]";
123新增: }
124新增: _statusBarIcon.Text = "Tai!";
125新增: SetIcon();
126新增: });
127新增: }
128新增:
129新增: /// <summary>
130新增: /// 设置图标
131新增: /// </summary>
132新增: /// <param name="iconType_">图标样式</param>
133新增: private void SetIcon(IconType iconType_ = IconType.Normal)
134新增: {
135新增: try
136新增: {
137新增: string iconName = "tai32";
138新增: switch (iconType_)
139新增: {
140新增: case IconType.Busy:
141新增: iconName = "taibusy";
142新增: break;
143新增: default:
144新增: iconName = "tai32";
145新增: break;
146新增: }
147新增: Stream iconStream = Application.GetResourceStream(new Uri($"pack://application:,,,/Tai;component/Resources/Icons/{iconName}.ico")).Stream;
148新增: _statusBarIcon.Icon = new Icon(iconStream);
149新增: }
150新增: catch (Exception ex)
151新增: {
152新增: Logger.Error(ex.Message);
153新增: Logger.Save(true);
154新增: }
155新增: }
156新增:
157新增: private void ShowMainWindow()
158新增: {
159新增: if (_mainWindow == null || _mainWindow.IsWindowClosed)
160新增: {
161新增: _mainWindow = new MainWindow();
162新增: _mainWindow.DataContext = _mainVM;
163新增: _mainWindow.Loaded += _mainWindow_Loaded;
164新增: _mainVM.LoadDefaultPage();
165新增: }
166新增: _mainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
167新增: _mainWindow.WindowState = WindowState.Normal;
168新增: _mainWindow.Show();
169新增: _mainWindow.Activate();
170新增: }
171新增:
172新增: private void _mainWindow_Loaded(object sender, RoutedEventArgs e)
173新增: {
174新增: var window = sender as MainWindow;
175新增:
176新增: _themeServicer.SetMainWindow(window);
177新增: _themeServicer.UpdateWindowStyle();
178新增: }
179新增:
180新增: private void ExitApp()
181新增: {
182新增: _statusBarIcon.Visible = false;
183新增:
184新增: Logger.Save(true);
185新增: Application.Current.Shutdown();
186新增: }
187新增: private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
188新增: {
189新增: ExitApp();
190新增: }
191新增:
192新增: private void MainWindowMenuItem_Click(object sender, RoutedEventArgs e)
193新增: {
194新增: ShowMainWindow();
195新增: }
196新增:
197新增: private void _statusBarIcon_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
198新增: {
199新增: if (e.Button == System.Windows.Forms.MouseButtons.Left && !AppState.IsLoading)
200新增: {
201新增: //双击托盘图标显示主窗口
202新增: ShowMainWindow();
203新增: }
204新增: }
205新增:
206新增: private void _statusBarIcon_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e)
207新增: {
208新增: if (e.Button == System.Windows.Forms.MouseButtons.Right && !AppState.IsLoading)
209新增: {
210新增: //右键单击弹出托盘菜单
211新增: _contextMenu.IsOpen = true;
212新增: }
213新增: }
214新增: }
215新增:}
修改UI/UI.csproj+2 −0看文件
@@ -201,6 +201,8 @@
201201 <Compile Include="Models\SettingPageModel.cs" />
202202 <Compile Include="Models\UINotifyPropertyChanged.cs" />
203203 <Compile Include="Models\WebSiteDetailPageModel.cs" />
204新增: <Compile Include="Servicers\IStatusBarIconServicer.cs" />
205新增: <Compile Include="Servicers\StatusBarIconServicer.cs" />
204206 <Compile Include="Servicers\WebSiteContextMenuServicer.cs" />
205207 <Compile Include="Servicers\AppContextMenuServicer.cs" />
206208 <Compile Include="Servicers\IWebSiteContextMenuServicer.cs" />