add:issue #181
This commit is contained in:
+26
-1
@@ -33,7 +33,9 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
public static string[] StartArgs;
|
public static string[] StartArgs;
|
||||||
public static string RootPath = Environment.GetEnvironmentVariable("APPDATA") + "\\Ink Canvas\\";
|
public static string RootPath = Environment.GetEnvironmentVariable("APPDATA") + "\\Ink Canvas\\";
|
||||||
|
|
||||||
|
// 新增:标记是否通过--board参数启动
|
||||||
|
public static bool StartWithBoardMode = false;
|
||||||
// 新增:保存看门狗进程对象
|
// 新增:保存看门狗进程对象
|
||||||
private static Process watchdogProcess;
|
private static Process watchdogProcess;
|
||||||
// 新增:标记是否为软件内主动退出
|
// 新增:标记是否为软件内主动退出
|
||||||
@@ -495,6 +497,14 @@ namespace Ink_Canvas
|
|||||||
// 检查是否为最终应用启动(更新后的应用)
|
// 检查是否为最终应用启动(更新后的应用)
|
||||||
bool isFinalApp = e.Args.Contains("--final-app");
|
bool isFinalApp = e.Args.Contains("--final-app");
|
||||||
bool skipMutexCheck = e.Args.Contains("--skip-mutex-check");
|
bool skipMutexCheck = e.Args.Contains("--skip-mutex-check");
|
||||||
|
|
||||||
|
// 检查是否通过--board参数启动
|
||||||
|
bool hasBoardArg = e.Args.Contains("--board");
|
||||||
|
if (hasBoardArg)
|
||||||
|
{
|
||||||
|
StartWithBoardMode = true;
|
||||||
|
LogHelper.WriteLogToFile("App | 检测到--board参数,将直接进入白板模式");
|
||||||
|
}
|
||||||
|
|
||||||
// 记录最终应用启动状态
|
// 记录最终应用启动状态
|
||||||
if (isFinalApp)
|
if (isFinalApp)
|
||||||
@@ -671,6 +681,21 @@ namespace Ink_Canvas
|
|||||||
LogHelper.WriteLogToFile("通过IPC发送文件路径失败", LogHelper.LogType.Warning);
|
LogHelper.WriteLogToFile("通过IPC发送文件路径失败", LogHelper.LogType.Warning);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 检查是否有--board参数
|
||||||
|
else if (hasBoardArg)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("检测到已运行实例且有--board参数,尝试通过IPC发送白板模式命令", LogHelper.LogType.Event);
|
||||||
|
|
||||||
|
// 尝试通过IPC发送白板模式命令给已运行实例
|
||||||
|
if (FileAssociationManager.TrySendBoardModeCommandToExistingInstance())
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("白板模式命令已通过IPC发送给已运行实例", LogHelper.LogType.Event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("通过IPC发送白板模式命令失败", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LogHelper.WriteLogToFile("检测到已运行实例,但无文件参数", LogHelper.LogType.Event);
|
LogHelper.WriteLogToFile("检测到已运行实例,但无文件参数", LogHelper.LogType.Event);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace Ink_Canvas.Helpers
|
|||||||
private const string IpcMutexName = "InkCanvasFileAssociationIpc";
|
private const string IpcMutexName = "InkCanvasFileAssociationIpc";
|
||||||
private const string IpcEventName = "InkCanvasFileAssociationEvent";
|
private const string IpcEventName = "InkCanvasFileAssociationEvent";
|
||||||
private const string IpcFilePrefix = "InkCanvasFileAssociation_";
|
private const string IpcFilePrefix = "InkCanvasFileAssociation_";
|
||||||
|
private const string IpcBoardModePrefix = "InkCanvasBoardMode_";
|
||||||
private const int IpcTimeout = 5000; // 5秒超时
|
private const int IpcTimeout = 5000; // 5秒超时
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -259,6 +260,56 @@ namespace Ink_Canvas.Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 尝试通过IPC将白板模式命令发送给已运行的实例
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>是否成功发送</returns>
|
||||||
|
public static bool TrySendBoardModeCommandToExistingInstance()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("尝试通过IPC发送白板模式命令给已运行实例", LogHelper.LogType.Event);
|
||||||
|
|
||||||
|
// 创建IPC文件
|
||||||
|
string tempDir = Path.GetTempPath();
|
||||||
|
string ipcFileName = IpcBoardModePrefix + Guid.NewGuid().ToString("N") + ".tmp";
|
||||||
|
string ipcFilePath = Path.Combine(tempDir, ipcFileName);
|
||||||
|
|
||||||
|
// 写入白板模式命令到IPC文件
|
||||||
|
File.WriteAllText(ipcFilePath, "BOARD_MODE", Encoding.UTF8);
|
||||||
|
|
||||||
|
// 创建事件通知已运行实例
|
||||||
|
using (EventWaitHandle ipcEvent = new EventWaitHandle(false, EventResetMode.ManualReset, IpcEventName))
|
||||||
|
{
|
||||||
|
ipcEvent.Set();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 等待一段时间让已运行实例处理命令
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
|
||||||
|
// 清理IPC文件
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(ipcFilePath))
|
||||||
|
{
|
||||||
|
File.Delete(ipcFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"清理IPC文件失败: {ex.Message}", LogHelper.LogType.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile("IPC白板模式命令发送完成", LogHelper.LogType.Event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"通过IPC发送白板模式命令失败: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 启动IPC监听器,等待其他实例发送文件路径
|
/// 启动IPC监听器,等待其他实例发送文件路径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -317,8 +368,9 @@ namespace Ink_Canvas.Helpers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
string tempDir = Path.GetTempPath();
|
string tempDir = Path.GetTempPath();
|
||||||
|
|
||||||
|
// 处理文件路径IPC文件
|
||||||
string[] ipcFiles = Directory.GetFiles(tempDir, IpcFilePrefix + "*.tmp");
|
string[] ipcFiles = Directory.GetFiles(tempDir, IpcFilePrefix + "*.tmp");
|
||||||
|
|
||||||
foreach (string ipcFile in ipcFiles)
|
foreach (string ipcFile in ipcFiles)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -367,6 +419,57 @@ namespace Ink_Canvas.Helpers
|
|||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理白板模式命令IPC文件
|
||||||
|
string[] boardModeFiles = Directory.GetFiles(tempDir, IpcBoardModePrefix + "*.tmp");
|
||||||
|
foreach (string ipcFile in boardModeFiles)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 读取命令内容
|
||||||
|
string command = File.ReadAllText(ipcFile, Encoding.UTF8);
|
||||||
|
|
||||||
|
if (command == "BOARD_MODE")
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("IPC接收到白板模式命令", LogHelper.LogType.Event);
|
||||||
|
|
||||||
|
// 在UI线程中处理白板模式切换
|
||||||
|
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 获取主窗口并切换到白板模式
|
||||||
|
if (Application.Current.MainWindow is MainWindow mainWindow)
|
||||||
|
{
|
||||||
|
mainWindow.SwitchToBoardMode();
|
||||||
|
mainWindow.ShowNotification("已切换到白板模式");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"IPC处理白板模式切换失败: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除IPC文件
|
||||||
|
File.Delete(ipcFile);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"处理白板模式IPC文件失败: {ex.Message}", LogHelper.LogType.Warning);
|
||||||
|
|
||||||
|
// 尝试删除损坏的IPC文件
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(ipcFile))
|
||||||
|
{
|
||||||
|
File.Delete(ipcFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -548,6 +548,17 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
// 检查模式设置并应用
|
// 检查模式设置并应用
|
||||||
CheckMainWindowVisibility();
|
CheckMainWindowVisibility();
|
||||||
|
|
||||||
|
// 检查是否通过--board参数启动,如果是则自动切换到白板模式
|
||||||
|
if (App.StartWithBoardMode)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("检测到--board参数,自动切换到白板模式", LogHelper.LogType.Event);
|
||||||
|
// 延迟执行,确保UI已完全加载
|
||||||
|
Dispatcher.BeginInvoke(new Action(() =>
|
||||||
|
{
|
||||||
|
SwitchToBoardMode();
|
||||||
|
}), DispatcherPriority.Loaded);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e)
|
private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e)
|
||||||
@@ -2702,6 +2713,27 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 切换到白板模式(用于--board参数和IPC命令)
|
||||||
|
/// 调用浮动栏上的白板功能
|
||||||
|
/// </summary>
|
||||||
|
public void SwitchToBoardMode()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile("开始切换到白板模式", LogHelper.LogType.Event);
|
||||||
|
|
||||||
|
// 调用浮动栏上的白板功能
|
||||||
|
ImageBlackboard_MouseUp(null, null);
|
||||||
|
|
||||||
|
LogHelper.WriteLogToFile("已成功切换到白板模式", LogHelper.LogType.Event);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogHelper.WriteLogToFile($"切换到白板模式时出错: {ex.Message}", LogHelper.LogType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user