improve:issue #5

This commit is contained in:
2025-07-20 12:36:21 +08:00
parent 38713108e0
commit 6c075d80ba
+83 -7
View File
@@ -85,9 +85,10 @@ namespace Ink_Canvas {
public static bool IsShowingRestoreHiddenSlidesWindow = false;
private static bool IsShowingAutoplaySlidesWindow = false;
// WPS 相关变量
private static Process wpsProcess = null;
private static bool hasWpsProcessID = false;
// WPP 相关变量
private static Process wppProcess = null;
private static bool hasWppProcessID = false;
private static System.Timers.Timer wppProcessCheckTimer = null;
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e) {
@@ -549,13 +550,14 @@ namespace Ink_Canvas {
try {
if (isFloatingBarFolded) await UnFoldFloatingBar(new object());
// 对于延迟未关闭的 WPP,先记录进程 ID,待所有结束事件处理完毕后强制关闭
if (pptApplication != null && pptApplication.Path.Contains("Kingsoft\\WPS Office\\") && pptApplication.Presentations.Count <= 1)
// 记录 WPP 进程 ID,用于后续检测未关闭的进程
if (pptApplication != null && pptApplication.Path.Contains("Kingsoft\\WPS Office\\"))
{
uint processId;
GetWindowThreadProcessId((IntPtr)pptApplication.HWND, out processId);
wpsProcess = Process.GetProcessById((int)processId);
hasWpsProcessID = true;
wppProcess = Process.GetProcessById((int)processId);
hasWppProcessID = true;
LogHelper.WriteLogToFile($"记录 WPP 进程 ID: {processId}", LogHelper.LogType.Trace);
}
LogHelper.WriteLogToFile(string.Format("PowerPoint Slide Show End"), LogHelper.LogType.Event);
@@ -646,6 +648,12 @@ namespace Ink_Canvas {
await Application.Current.Dispatcher.InvokeAsync(() => {
ViewboxFloatingBarMarginAnimation(100, true);
});
// 启动 WPP 进程检测定时器
if (hasWppProcessID && wppProcess != null)
{
StartWppProcessCheckTimer();
}
}
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
@@ -1000,5 +1008,73 @@ namespace Ink_Canvas {
private void ImagePPTControlEnd_MouseUp(object sender, MouseButtonEventArgs e) {
BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null);
}
private void StartWppProcessCheckTimer()
{
if (wppProcessCheckTimer != null)
{
wppProcessCheckTimer.Stop();
wppProcessCheckTimer.Dispose();
}
wppProcessCheckTimer = new System.Timers.Timer(2000); // 2秒检查一次
wppProcessCheckTimer.Elapsed += WppProcessCheckTimer_Elapsed;
wppProcessCheckTimer.Start();
LogHelper.WriteLogToFile("启动 WPP 进程检测定时器", LogHelper.LogType.Trace);
}
private void WppProcessCheckTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
if (wppProcess == null || hasWppProcessID == false)
{
StopWppProcessCheckTimer();
return;
}
// 刷新进程状态
wppProcess.Refresh();
if (wppProcess.HasExited)
{
LogHelper.WriteLogToFile("WPP 进程已正常关闭", LogHelper.LogType.Trace);
StopWppProcessCheckTimer();
}
else
{
// 检查是否超过 5 秒仍未关闭
var processStartTime = wppProcess.StartTime;
var timeSinceStart = DateTime.Now - processStartTime;
if (timeSinceStart.TotalSeconds > 5)
{
LogHelper.WriteLogToFile("检测到长时间未关闭的 WPP 进程,开始强制关闭", LogHelper.LogType.Event);
wppProcess.Kill();
LogHelper.WriteLogToFile("强制关闭 WPP 进程成功", LogHelper.LogType.Event);
StopWppProcessCheckTimer();
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"WPP 进程检测失败: {ex.ToString()}", LogHelper.LogType.Error);
StopWppProcessCheckTimer();
}
}
private void StopWppProcessCheckTimer()
{
if (wppProcessCheckTimer != null)
{
wppProcessCheckTimer.Stop();
wppProcessCheckTimer.Dispose();
wppProcessCheckTimer = null;
}
wppProcess = null;
hasWppProcessID = false;
LogHelper.WriteLogToFile("停止 WPP 进程检测定时器", LogHelper.LogType.Trace);
}
}
}