跳到主要内容

github/tai

公开

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

提交记录
修改Core/Servicers/Instances/Observer.cs+92 −71看文件
@@ -18,11 +18,8 @@ namespace Core.Servicers.Instances
1818 private IntPtr hook;
1919 Win32API.WinEventDelegate winEventDelegate;
2020
21删除:
2221 public event ObserverEventHandler OnAppActive;
2322
24删除:
25删除: //private string activeProcessName, activeProcessFile = null;
2623 public Observer()
2724 {
2825 winEventDelegate = new Win32API.WinEventDelegate(WinEventProc);
@@ -31,70 +28,107 @@ namespace Core.Servicers.Instances
3128 {
3229 hook = Win32API.SetWinEventHook(0x0003, 0x0003, IntPtr.Zero,
3330 winEventDelegate, 0, 0, 0);
31新增:
32新增: var window = Win32API.GetForegroundWindow();
33新增: Handle(window);
34新增: }
35新增:
36新增: private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
37新增: {
38新增: Handle(hwnd);
3439 }
3540
36删除: private async void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
41新增: private async void Handle(IntPtr hwnd)
3742 {
3843 string processName = String.Empty, processFileName = String.Empty, processDescription = String.Empty;
44新增:
3945 var processResult = await Task.Run(() =>
40删除: {
41删除: try
42删除: {
43删除: string[] processInfo = GetProcessInfoByWindowHandle(hwnd);
44删除: int processID = int.Parse(processInfo[2]);
45删除: processName = processInfo[0];
46删除: processFileName = processInfo[1];
47删除:
48删除:
49删除: // handle uwp app
50删除: if (processFileName.IndexOf("ApplicationFrameHost.exe") != -1)
51删除: {
52删除: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID);
53删除: if (processFileName == null)
54删除: {
55删除: Thread.Sleep(1500);
56删除:
57删除: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID);
58删除: processName = GetUWPAPPName(processFileName);
59删除:
60删除: IntPtr foregeroundHwnd = Win32API.GetForegroundWindow();
61删除:
62删除: if (foregeroundHwnd != hwnd)
63删除: {
64删除: // 获取后焦点变了
65删除: processInfo = GetProcessInfoByWindowHandle(foregeroundHwnd);
66删除: processID = int.Parse(processInfo[2]);
67删除: processName = processInfo[0];
68删除: processFileName = processInfo[1];
69删除: }
70删除:
71删除: }
72删除: else
73删除: {
74删除: processName = GetUWPAPPName(processFileName);
75删除: }
76删除:
77删除: }
78删除: Debug.WriteLine("file name: ---------> " + " | " + hwnd + " | " + processID + processFileName);
79删除: Debug.WriteLine("app name: ---------> " + processName);
80删除: FileVersionInfo info = FileVersionInfo.GetVersionInfo(processFileName);
81删除: processDescription = info.FileDescription;
82删除:
83删除:
84删除: //Debug.WriteLine("file name: ---------> " + processFileName);
85删除: //Debug.WriteLine("app name: ---------> " + processName);
86删除: //Debug.WriteLine("processDescription: ---------> " + processDescription);
87删除: }
88删除: catch (Exception e)
89删除: {
90删除: Logger.Warn(e.Message + " | Process Name:" + processName + " | Process File:" + processFileName + " | Process Description:" + processDescription);
91删除: }
92删除: return processName;
93删除: });
46新增: {
47新增: try
48新增: {
49新增: string[] processInfo = GetProcessInfoByWindowHandle(hwnd);
50新增: int processID = int.Parse(processInfo[2]);
51新增: processName = processInfo[0];
52新增: processFileName = processInfo[1];
53新增:
54新增:
55新增: // handle uwp app
56新增: if (processFileName.IndexOf("ApplicationFrameHost.exe") != -1)
57新增: {
58新增: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID);
59新增: if (processFileName == null)
60新增: {
61新增: Thread.Sleep(1500);
62新增:
63新增: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID);
64新增: processName = GetUWPAPPName(processFileName);
65新增:
66新增: IntPtr foregeroundHwnd = Win32API.GetForegroundWindow();
67新增:
68新增: if (foregeroundHwnd != hwnd)
69新增: {
70新增: // 获取后焦点变了
71新增: processInfo = GetProcessInfoByWindowHandle(foregeroundHwnd);
72新增: processID = int.Parse(processInfo[2]);
73新增: processName = processInfo[0];
74新增: processFileName = processInfo[1];
75新增: }
76新增:
77新增: }
78新增: else
79新增: {
80新增: processName = GetUWPAPPName(processFileName);
81新增: }
82新增:
83新增: }
84新增: FileVersionInfo info = FileVersionInfo.GetVersionInfo(processFileName);
85新增: processDescription = info.FileDescription;
86新增:
87新增:
88新增: int titleCapacity = Win32API.GetWindowTextLength(hwnd) * 2;
89新增: StringBuilder stringBuilder = new StringBuilder(titleCapacity);
90新增: Win32API.GetWindowText(hwnd, stringBuilder, stringBuilder.Capacity);
91新增: if (IsSystemProcess(processName, stringBuilder.ToString()))
92新增: {
93新增: // 过滤掉一些系统进程
94新增: processName = string.Empty;
95新增: }
96新增: }
97新增: catch (Exception e)
98新增: {
99新增: Logger.Warn(e.Message + " | Process Name:" + processName + " | Process File:" + processFileName + " | Process Description:" + processDescription);
100新增: }
101新增: return processName;
102新增: });
94103
95104 EventInvoke(processName, processDescription, processFileName);
96105 }
97106
107新增: /// <summary>
108新增: /// 指示指定进程是否属于系统进程
109新增: /// </summary>
110新增: /// <param name="processName">进程名称</param>
111新增: /// <param name="title">窗口标题</param>
112新增: /// <returns></returns>
113新增: private bool IsSystemProcess(string processName, string title)
114新增: {
115新增: processName = processName.ToLower();
116新增: int length = title.Length;
117新增: string[] titleArr = { "UnlockingWindow", "Program Manager" };
118新增:
119新增: if (processName == "explorer")
120新增: {
121新增: if (length == 0)
122新增: {
123新增: // 可能是任务栏
124新增: return true;
125新增: }
126新增: return titleArr.Contains(title);
127新增:
128新增: }
129新增: return false;
130新增: }
131新增:
98132 private string GetUWPAPPName(string processFileName)
99133 {
100134 string processName = string.Empty;
@@ -137,19 +171,6 @@ namespace Core.Servicers.Instances
137171 }
138172 private void EventInvoke(string processName, string description, string filename)
139173 {
140删除: // 防止重复和错误响应
141删除: //if (string.IsNullOrEmpty(processName) || string.IsNullOrEmpty(filename) || !File.Exists(filename))
142删除: //{
143删除: // return;
144删除: //}
145删除: //if (filename == activeProcessFile && processName == activeProcessName)
146删除: //{
147删除: // return;
148删除: //}
149删除:
150删除: //activeProcessName = processName;
151删除: //activeProcessFile = filename;
152删除:
153174 OnAppActive?.Invoke(processName, description, filename);
154175 }
155176