提交记录修改Core/Servicers/Instances/Sleepdiscover.cs+60 −7看文件
| @@ -7,6 +7,7 @@ using System; | ||
| 7 | 7 | using System.Collections.Generic; |
| 8 | 8 | using System.Diagnostics; |
| 9 | 9 | using System.Linq; |
| 10 | 新增:using System.Runtime.InteropServices; | |
| 10 | 11 | using System.Text; |
| 11 | 12 | using System.Threading.Tasks; |
| 12 | 13 | using System.Windows; |
| @@ -24,16 +25,48 @@ namespace Core.Servicers.Instances | ||
| 24 | 25 | |
| 25 | 26 | private SleepStatus status = SleepStatus.Wake; |
| 26 | 27 | |
| 27 | 删除: // 播放声音开始时间 | |
| 28 | 新增: /// <summary> | |
| 29 | 新增: /// 播放声音开始时间 | |
| 30 | 新增: /// </summary> | |
| 28 | 31 | private DateTime playSoundStartTime; |
| 29 | 32 | |
| 33 | 新增: /// <summary> | |
| 34 | 新增: /// 最后一次按键时间 | |
| 35 | 新增: /// </summary> | |
| 36 | 新增: private DateTime pressKeyboardLastTime; | |
| 37 | 新增: | |
| 30 | 38 | private readonly IObserver observer; |
| 31 | 39 | |
| 40 | 新增: private Win32API.LowLevelKeyboardProc keyboardProc; | |
| 41 | 新增: private static IntPtr hookKeyboardID = IntPtr.Zero; | |
| 42 | 新增: | |
| 32 | 43 | public Sleepdiscover(IObserver observer) |
| 33 | 44 | { |
| 34 | 45 | this.observer = observer; |
| 35 | 46 | observer.OnAppActive += Observer_OnAppActive; |
| 36 | 47 | SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(OnPowerModeChanged); |
| 48 | 新增: | |
| 49 | 新增: keyboardProc = HookCallback; | |
| 50 | 新增: } | |
| 51 | 新增: | |
| 52 | 新增: private IntPtr HookCallback( | |
| 53 | 新增: int nCode, IntPtr wParam, IntPtr lParam) | |
| 54 | 新增: { | |
| 55 | 新增: if (nCode >= 0 && wParam == (IntPtr)Win32API.WM_KEYDOWN) | |
| 56 | 新增: { | |
| 57 | 新增: int vkCode = Marshal.ReadInt32(lParam); | |
| 58 | 新增: | |
| 59 | 新增: if (status == SleepStatus.Sleep) | |
| 60 | 新增: { | |
| 61 | 新增: status = SleepStatus.Wake; | |
| 62 | 新增: SleepStatusChanged?.Invoke(status); | |
| 63 | 新增: } | |
| 64 | 新增: else | |
| 65 | 新增: { | |
| 66 | 新增: pressKeyboardLastTime = DateTime.Now; | |
| 67 | 新增: } | |
| 68 | 新增: } | |
| 69 | 新增: return Win32API.CallNextHookEx(hookKeyboardID, nCode, wParam, lParam); | |
| 37 | 70 | } |
| 38 | 71 | |
| 39 | 72 | private void OnPowerModeChanged(object sender, PowerModeChangedEventArgs e) |
| @@ -72,19 +105,26 @@ namespace Core.Servicers.Instances | ||
| 72 | 105 | { |
| 73 | 106 | timer = new DispatcherTimer(); |
| 74 | 107 | timer.Interval = new TimeSpan(0, 2, 0); |
| 108 | 新增:#if DEBUG | |
| 109 | 新增: timer.Interval = new TimeSpan(0, 0, 10); | |
| 110 | 新增:#endif | |
| 75 | 111 | timer.Tick += Timer_Tick; |
| 76 | 112 | timer.Start(); |
| 77 | 113 | |
| 78 | 114 | Win32API.GetCursorPos(out lastPoint); |
| 79 | 115 | |
| 80 | 116 | playSoundStartTime = DateTime.MinValue; |
| 117 | 新增: | |
| 118 | 新增: pressKeyboardLastTime = DateTime.Now; | |
| 119 | 新增: | |
| 120 | 新增: // 设置键盘钩子 | |
| 121 | 新增: Win32API.SetKeyboardHook(keyboardProc); | |
| 81 | 122 | } |
| 82 | 123 | |
| 83 | 124 | private void Timer_Tick(object sender, EventArgs e) |
| 84 | 125 | { |
| 85 | 126 | Point point; |
| 86 | 127 | Win32API.GetCursorPos(out point); |
| 87 | 删除: | |
| 88 | 128 | if (point == null) |
| 89 | 129 | { |
| 90 | 130 | return; |
| @@ -118,7 +158,7 @@ namespace Core.Servicers.Instances | ||
| 118 | 158 | // 判断声音时间是否超过2个小时 |
| 119 | 159 | TimeSpan timeSpan = DateTime.Now - playSoundStartTime; |
| 120 | 160 | |
| 121 | 删除: if (timeSpan.TotalHours >= 2) | |
| 161 | 新增: if (timeSpan.TotalHours >= 2 && IsPressKeyboardOuttime()) | |
| 122 | 162 | { |
| 123 | 163 | // 超过表示可能睡着了,切换状态 |
| 124 | 164 | status = SleepStatus.Sleep; |
| @@ -131,9 +171,12 @@ namespace Core.Servicers.Instances | ||
| 131 | 171 | } |
| 132 | 172 | else |
| 133 | 173 | { |
| 134 | 删除: // 没有播放声音切换状态 | |
| 135 | 删除: status = SleepStatus.Sleep; | |
| 136 | 删除: SleepStatusChanged?.Invoke(status); | |
| 174 | 新增: if (IsPressKeyboardOuttime()) | |
| 175 | 新增: { | |
| 176 | 新增: // 没有播放声音且键盘休眠超时 | |
| 177 | 新增: status = SleepStatus.Sleep; | |
| 178 | 新增: SleepStatusChanged?.Invoke(status); | |
| 179 | 新增: } | |
| 137 | 180 | } |
| 138 | 181 | } |
| 139 | 182 | } |
| @@ -147,8 +190,18 @@ namespace Core.Servicers.Instances | ||
| 147 | 190 | SleepStatusChanged?.Invoke(status); |
| 148 | 191 | } |
| 149 | 192 | } |
| 150 | 删除: | |
| 151 | 193 | Win32API.GetCursorPos(out lastPoint); |
| 152 | 194 | } |
| 195 | 新增: | |
| 196 | 新增: | |
| 197 | 新增: /// <summary> | |
| 198 | 新增: /// 通过按键时间判断(超过5分钟未有键盘操作视为超时) | |
| 199 | 新增: /// </summary> | |
| 200 | 新增: /// <returns></returns> | |
| 201 | 新增: private bool IsPressKeyboardOuttime() | |
| 202 | 新增: { | |
| 203 | 新增: TimeSpan timeSpan = DateTime.Now - pressKeyboardLastTime; | |
| 204 | 新增: return timeSpan.TotalMinutes >= 5; | |
| 205 | 新增: } | |
| 153 | 206 | } |
| 154 | 207 | } |

