You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#剪贴板应用双时长清板定时器功能缺失求助

实现SumDeleteCopyTimer的完整方案

嘿,我来帮你搞定这个SumDeleteCopyTimer的实现!看起来你已经有了DeleteQuestionTimer的基础逻辑,咱们照着这个思路扩展就行,分几步来:

1. 新增定时器实例并初始化

首先,和DeleteQuestionTimer一样,先声明并初始化用于控制数学计算结果时效的定时器,设置10秒的间隔,并且确保它只触发一次(每次复制新的表达式时手动重置):

// 用于清除数学计算结果的定时器,10秒有效期
private System.Timers.Timer _sumDeleteCopyTimer;

// 在窗体构造函数或初始化方法里完成配置
public YourClipboardAppForm()
{
    InitializeComponent();
    
    // 初始化SumDeleteCopyTimer
    _sumDeleteCopyTimer = new System.Timers.Timer(10000); // 10000毫秒 = 10秒
    _sumDeleteCopyTimer.Elapsed += SumDeleteCopyTimer_Elapsed;
    _sumDeleteCopyTimer.AutoReset = false; // 仅触发一次,避免重复执行
}

2. 处理数学表达式的复制逻辑

当检测到用户复制的是数学表达式时,计算结果并写入剪贴板,同时停止另一个定时器(避免冲突),然后启动/重置SumDeleteCopyTimer:

// 假设你有一个方法判断当前复制内容是数学表达式
private void OnMathExpressionCopied(string mathExpression)
{
    // 1. 计算表达式结果(这里替换成你实际的计算逻辑,比如用NCalc库)
    string calculationResult = CalculateMathResult(mathExpression);
    
    // 2. 将计算结果写入剪贴板
    Clipboard.SetText(calculationResult);
    
    // 3. 停止问题定时器(如果它正在运行)
    _deleteQuestionTimer?.Stop();
    
    // 4. 重置并启动数学结果定时器
    _sumDeleteCopyTimer.Stop();
    _sumDeleteCopyTimer.Start();
}

// 模拟计算方法,你可以替换成实际实现
private string CalculateMathResult(string expression)
{
    try
    {
        // 示例用NCalc库处理表达式,你需要先安装NCalc NuGet包
        var expr = new NCalc.Expression(expression);
        return expr.Evaluate().ToString();
    }
    catch (Exception ex)
    {
        return $"计算错误: {ex.Message}";
    }
}

3. 实现定时器到期的清除逻辑

当10秒到期时,清空剪贴板里的计算结果(如果需要恢复原表达式,可以在复制时保存原内容,这里示例直接清空):

private void SumDeleteCopyTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // 注意:剪贴板操作必须在UI线程执行,所以WinForms里要判断Invoke
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(ClearCalculationResult));
    }
    else
    {
        ClearCalculationResult();
    }
}

private void ClearCalculationResult()
{
    // 方案1:直接清空剪贴板
    Clipboard.Clear();
    
    // 方案2:恢复原数学表达式(如果复制时保存了原内容)
    // if (!string.IsNullOrEmpty(_lastCopiedMathExpression))
    // {
    //     Clipboard.SetText(_lastCopiedMathExpression);
    // }
}

4. 确保两个定时器互斥

在处理问题列表复制的现有逻辑里,记得停止SumDeleteCopyTimer,避免两个定时器同时生效:

// 你现有的处理问题复制的方法
private void OnQuestionCopied(string question)
{
    // 获取对应答案并写入剪贴板
    string answer = GetQuestionAnswer(question);
    Clipboard.SetText(answer);
    
    // 停止数学结果定时器(如果正在运行)
    _sumDeleteCopyTimer?.Stop();
    
    // 重置并启动问题定时器
    _deleteQuestionTimer.Stop();
    _deleteQuestionTimer.Start();
}

5. 资源清理

在应用关闭时,记得释放定时器资源,避免内存泄漏:

private void YourClipboardAppForm_FormClosing(object sender, FormClosingEventArgs e)
{
    _deleteQuestionTimer?.Stop();
    _deleteQuestionTimer?.Dispose();
    
    _sumDeleteCopyTimer?.Stop();
    _sumDeleteCopyTimer?.Dispose();
}

这样一来,SumDeleteCopyTimer就能和DeleteQuestionTimer各司其职:复制问题时答案仅1秒可粘贴,复制数学表达式时结果10秒可粘贴,两者互不干扰。

内容的提问来源于stack exchange,提问作者user11977639

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:19:31