跳到主要内容

github/tai

公开

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

提交记录
修改Core/Servicers/Instances/Observer.cs+88 −39看文件
@@ -8,6 +8,7 @@ using System.IO;
88using System.Linq;
99using System.Runtime.InteropServices;
1010using System.Text;
11新增:using System.Threading;
1112using System.Threading.Tasks;
1213
1314namespace Core.Servicers.Instances
@@ -32,60 +33,108 @@ namespace Core.Servicers.Instances
3233 winEventDelegate, 0, 0, 0);
3334 }
3435
35删除: private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
36新增: private async void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
3637 {
3738 string processName = String.Empty, processFileName = String.Empty, processDescription = String.Empty;
39新增: 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(500);
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新增: });
3894
39删除: try
40删除: {
41删除: int processID = 0;
42删除: Win32API.GetWindowThreadProcessId(hwnd, out processID);
43删除: Process process = Process.GetProcessById(processID);
44删除: processName = process.ProcessName;
45删除:
46删除: IntPtr processHandle = IntPtr.Zero;
47删除: processHandle = Win32API.OpenProcess(0x001F0FFF, false, processID);
95新增: EventInvoke(processName, processDescription, processFileName);
96新增: }
4897
49删除: if (processName == "Snipaste")
50删除: {
98新增: private string GetUWPAPPName(string processFileName)
99新增: {
100新增: string processName = string.Empty;
101新增: if (!string.IsNullOrEmpty(processFileName) && processFileName.IndexOf("\\") != -1)
102新增: {
103新增: processName = processFileName.Split('\\').Last();
104新增: processName = processName.Replace(".exe", "");
105新增: }
106新增: return processName;
107新增: }
108新增: /// <summary>
109新增: /// 通过窗口句柄获取进程信息
110新增: /// </summary>
111新增: /// <param name="hwnd"></param>
112新增: /// <returns></returns>
113新增: private string[] GetProcessInfoByWindowHandle(IntPtr hwnd)
114新增: {
115新增: string processName, processFileName = string.Empty;
51116
52删除: int error = Marshal.GetLastWin32Error();
117新增: int processID = 0;
118新增: Win32API.GetWindowThreadProcessId(hwnd, out processID);
119新增: Process process = Process.GetProcessById(processID);
120新增: processName = process.ProcessName;
53121
54删除: Debug.WriteLine("The last Win32 Error was: " + error);
122新增: IntPtr processHandle = IntPtr.Zero;
123新增: processHandle = Win32API.OpenProcess(0x001F0FFF, false, processID);
55124
56删除: }
125新增: if (processHandle != IntPtr.Zero)
126新增: {
57127 int MaxPathLength = 4096;
58128 var buffer = new StringBuilder(MaxPathLength);
59129 Win32API.QueryFullProcessImageName(processHandle, 0, buffer, ref MaxPathLength);
60130 processFileName = buffer.ToString();
61删除:
62删除: // handle uwp app
63删除: if (processFileName.IndexOf("ApplicationFrameHost.exe") != -1)
64删除: {
65删除: processFileName = Win32API.UWP_AppName(hwnd, (uint)processID);
66删除: if (processFileName != string.Empty && processFileName.IndexOf("\\") != -1)
67删除: {
68删除: processName = processFileName.Split('\\').Last();
69删除: processName = processName.Replace(".exe", "");
70删除: }
71删除: }
72删除:
73删除: FileVersionInfo info = FileVersionInfo.GetVersionInfo(processFileName);
74删除: processDescription = info.FileDescription;
75删除:
76删除:
77删除: //Debug.WriteLine("file name: ---------> " + processFileName);
78删除: //Debug.WriteLine("app name: ---------> " + processName);
79删除: //Debug.WriteLine("processDescription: ---------> " + processDescription);
80131 }
81删除: catch (Exception e)
132新增: else
82133 {
83删除: Logger.Error(e.Message + " | Process Name:" + processName + " | Process File:" + processFileName + " | Process Description:" + processDescription);
134新增: Logger.Warn($"无法获取进程:{processName}的句柄,请尝试以管理员身份运行Tai。");
84135 }
85删除:
86删除: EventInvoke(processName, processDescription, processFileName);
136新增: return new string[] { processName, processFileName, processID.ToString() };
87137 }
88删除:
89138 private void EventInvoke(string processName, string description, string filename)
90139 {
91140 // 防止重复和错误响应