修正遙控器SafeInvokeAction

This commit is contained in:
jasonchenwork 2025-06-24 10:45:29 +08:00
parent 5d2ea02263
commit f07129c18f

View File

@ -26,10 +26,9 @@ namespace DualScreenDemo
/// 遙控器接收資料 /// 遙控器接收資料
/// </summary> /// </summary>
public async Task ProcessData(string indata) public async Task ProcessData(string indata)
{ { AddToHistory(indata);
AddToHistory(indata);
// 遙控器測試 // 遙控器測試
Console.WriteLine("遙控器: " + indata); // Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 遙控器: {indata}");
switch (indata) switch (indata)
{ {
case "A261A4": // 輸入 case "A261A4": // 輸入
@ -70,12 +69,12 @@ namespace DualScreenDemo
// 原唱 // 原唱
case "A26CA4": case "A26CA4":
Console.WriteLine("ToggleVocalRemoval Invoked"); Console.WriteLine("ToggleVocalRemoval Invoked");
InvokeAction(() => VideoPlayerForm.Instance.ToggleVocalRemoval()); SafeInvokeAction("A26CA4",() => VideoPlayerForm.Instance.ToggleVocalRemoval());
InvokeAction(() => OverlayForm.MainForm.ShowOriginalSongLabel()); SafeInvokeAction("A26CA4",() => OverlayForm.MainForm.ShowOriginalSongLabel());
break; break;
// 導唱 // 導唱
case "A26EA4": case "A26EA4":
InvokeAction(() => VideoPlayerForm.Instance.ToggleVocalRemoval()); SafeInvokeAction("A26EA4",() => VideoPlayerForm.Instance.ToggleVocalRemoval());
break; break;
case "A26DA4": case "A26DA4":
PauseOrResumeSong(); PauseOrResumeSong();
@ -88,106 +87,131 @@ namespace DualScreenDemo
HandleArtistAnnouncements(); HandleArtistAnnouncements();
break; break;
case "A2B3A4": case "A2B3A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2B3A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowVolumeUpLabel()); SafeInvokeAction("A2B3A4",() => OverlayForm.MainForm.ShowVolumeUpLabel());
break; break;
case "A2B4A4": case "A2B4A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2B4A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowVolumeDownLabel()); SafeInvokeAction("A2B4A4",() => OverlayForm.MainForm.ShowVolumeDownLabel());
break; break;
case "A2B5A4": case "A2B5A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2B5A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowMicUpLabel()); SafeInvokeAction("A2B5A4",() => OverlayForm.MainForm.ShowMicUpLabel());
break; break;
case "A2B6A4": case "A2B6A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2B6A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowMicDownLabel()); SafeInvokeAction("A2B6A4",() => OverlayForm.MainForm.ShowMicDownLabel());
break; break;
case "A2C2A4": case "A2C2A4":
InvokeAction(() => OverlayForm.MainForm.HidemicLabels()); SafeInvokeAction("A2C2A4",() => OverlayForm.MainForm.HidemicLabels());
InvokeAction(() => OverlayForm.MainForm.ShowStandardLabel()); SafeInvokeAction("A2C2A4",() => OverlayForm.MainForm.ShowStandardLabel());
break; break;
case "A2C3A4": case "A2C3A4":
InvokeAction(() => OverlayForm.MainForm.HidemicLabels()); SafeInvokeAction("A2C3A4",() => OverlayForm.MainForm.HidemicLabels());
InvokeAction(() => OverlayForm.MainForm.ShowProfessionalLabel()); SafeInvokeAction("A2C3A4",() => OverlayForm.MainForm.ShowProfessionalLabel());
break; break;
case "A2C4A4": case "A2C4A4":
InvokeAction(() => OverlayForm.MainForm.HidemicLabels()); SafeInvokeAction("A2C4A4",() => OverlayForm.MainForm.HidemicLabels());
InvokeAction(() => OverlayForm.MainForm.ShowSquareLabel()); SafeInvokeAction("A2C4A4",() => OverlayForm.MainForm.ShowSquareLabel());
break; break;
case "A2C1A4": case "A2C1A4":
InvokeAction(() => OverlayForm.MainForm.HidemicLabels()); SafeInvokeAction("A2C1A4",() => OverlayForm.MainForm.HidemicLabels());
InvokeAction(() => OverlayForm.MainForm.ShowSingDownLabel()); SafeInvokeAction("A2C1A4",() => OverlayForm.MainForm.ShowSingDownLabel());
break; break;
case "A2D5A4": case "A2D5A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2D5A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowBrightLabel()); SafeInvokeAction("A2D5A4",() => OverlayForm.MainForm.ShowBrightLabel());
break; break;
case "A2D7A4": case "A2D7A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2D7A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowRomanticLabel()); SafeInvokeAction("A2D7A4",() => OverlayForm.MainForm.ShowRomanticLabel());
break; break;
/* case "A27CA4": /* case "A27CA4":
InvokeAction(() => OverlayForm.MainForm.ShowMaleKeyLabel()); InvokeAction(() => OverlayForm.MainForm.ShowMaleKeyLabel());
break; break;
case "A282A4": case "A282A4":
InvokeAction(() => OverlayForm.MainForm.ShowFemaleKeyLabel()); InvokeAction(() => OverlayForm.MainForm.ShowFemaleKeyLabel());
break;*/ break;*/
case "A2D6A4": case "A2D6A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2D6A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowSoftLabel()); SafeInvokeAction("A2D6A4",() => OverlayForm.MainForm.ShowSoftLabel());
break; break;
case "A2D8A4": case "A2D8A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A2D8A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowDynamicLabel()); SafeInvokeAction("A2D8A4",() => OverlayForm.MainForm.ShowDynamicLabel());
break; break;
case "A275A4": case "A275A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A275A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowTintLabel()); SafeInvokeAction("A275A4",() => OverlayForm.MainForm.ShowTintLabel());
break; break;
case "A283A4": case "A283A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A283A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyUpLabel("↑升4調")); SafeInvokeAction("A283A4",() => OverlayForm.MainForm.ShowKeyUpLabel("↑升4調"));
break; break;
case "A282A4": case "A282A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A282A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyUpLabel("↑升3調")); SafeInvokeAction("A282A4",() => OverlayForm.MainForm.ShowKeyUpLabel("↑升3調"));
break; break;
case "A281A4": case "A281A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A281A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyUpLabel("↑升2調")); SafeInvokeAction("A281A4",() => OverlayForm.MainForm.ShowKeyUpLabel("↑升2調"));
break; break;
case "A280A4": case "A280A4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A280A4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyUpLabel("↑升1調")); SafeInvokeAction("A280A4",() => OverlayForm.MainForm.ShowKeyUpLabel("↑升1調"));
break; break;
case "A27FA4": case "A27FA4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A27FA4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowStandardKeyLabel()); SafeInvokeAction("A27FA4",() => OverlayForm.MainForm.ShowStandardKeyLabel());
break; break;
case "A27EA4": case "A27EA4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A27EA4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyDownLabel("↓降1調")); SafeInvokeAction("A27EA4",() => OverlayForm.MainForm.ShowKeyDownLabel("↓降1調"));
break; break;
case "A27DA4": case "A27DA4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A27EA4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyDownLabel("↓降2調")); SafeInvokeAction("A27EA4",() => OverlayForm.MainForm.ShowKeyDownLabel("↓降2調"));
break; break;
case "A27CA4": case "A27CA4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A27CA4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyDownLabel("↓降3調")); SafeInvokeAction("A27CA4",() => OverlayForm.MainForm.ShowKeyDownLabel("↓降3調"));
break; break;
case "A27BA4": case "A27BA4":
InvokeAction(() => OverlayForm.MainForm.HideAllLabels()); SafeInvokeAction("A27BA4",() => OverlayForm.MainForm.HideAllLabels());
InvokeAction(() => OverlayForm.MainForm.ShowKeyDownLabel("↓降4調")); SafeInvokeAction("A27BA4",() => OverlayForm.MainForm.ShowKeyDownLabel("↓降4調"));
break; break;
default: default:
if (Regex.IsMatch(indata, @"^A23\d+A4$")) if (Regex.IsMatch(indata, @"^A23\d+A4$"))
{ {
HandleNumberInput(indata); HandleNumberInput(indata);
} }
break; break;
} }
}
private Dictionary<string, DateTime> _recentCommands = new();
private readonly TimeSpan _debounceInterval = TimeSpan.FromMilliseconds(300); // 最短觸發間隔
private void SafeInvokeAction(string commandKey, Action action)
{
/*var now = DateTime.Now;
if (_recentCommands.TryGetValue(commandKey, out DateTime lastTime))
{
if (now - lastTime < _debounceInterval)
return; // 忽略短時間內的重複指令
}
_recentCommands[commandKey] = now;
*/
// 真正執行 UI 操作
if (OverlayForm.MainForm.InvokeRequired)
{
OverlayForm.MainForm.BeginInvoke(action);
}
else
{
action();
}
} }
private void AddToHistory(string indata) private void AddToHistory(string indata)