feat: 重构媒体播放检测逻辑,使用后台STA线程持续监控并集成WinRT API。

This commit is contained in:
2026-01-20 11:23:06 +08:00
parent 37bef1ead3
commit cb6a4f4d2c
2 changed files with 205 additions and 170 deletions

View File

@@ -124,29 +124,54 @@ namespace TimerApp
private void OnTick()
{
// 在锁外执行耗时的系统检测
long idleMs = 0;
bool? newMediaPlaying = null;
lock (_lock)
{
// 如果处于暂停状态,不处理计时逻辑
if (_isPaused)
{
return;
}
if (_isPaused) return;
long idleMs;
TimeSpan idleTime;
// 优化降低系统API调用频率
// 每 CheckIntervalTicks (3) 秒更新一次状态
// 检查是否需要更新状态
_checkTickCounter++;
if (_checkTickCounter >= CheckIntervalTicks)
{
_checkTickCounter = 0;
_cachedIdleMs = NativeMethods.GetIdleTime();
_cachedMediaPlaying = NativeMethods.IsMediaPlaying();
// 需要更新,但在锁外进行
newMediaPlaying = true;
}
// 如果不需要更新,直接使用缓存值
if (newMediaPlaying == null)
{
idleMs = _cachedIdleMs;
}
}
// 在锁外执行实际的检测
if (newMediaPlaying == true)
{
idleMs = NativeMethods.GetIdleTime();
bool playing = NativeMethods.IsMediaPlaying();
// 更新缓存
lock (_lock)
{
_cachedIdleMs = idleMs;
_cachedMediaPlaying = playing;
}
}
lock (_lock)
{
// 再次检查暂停状态
if (_isPaused) return;
// 使用(可能是新更新的)缓存值
idleMs = _cachedIdleMs;
idleTime = TimeSpan.FromMilliseconds(idleMs);
bool isMediaPlaying = _cachedMediaPlaying;
TimeSpan idleTime = TimeSpan.FromMilliseconds(idleMs);
if (CurrentState == MonitorState.Resting)
{
@@ -170,9 +195,6 @@ namespace TimerApp
}
else
{
// 使用缓存的媒体播放状态
bool isMediaPlaying = _cachedMediaPlaying;
// 工作/空闲模式逻辑
if (idleTime > IdleThreshold || isMediaPlaying)
{