【问题标题】:Why is my clipboard-manipulating application behaving differently when run outside of Visual Studio?为什么我的剪贴板操作应用程序在 Visual Studio 之外运行时表现不同?
【发布时间】:2016-08-09 16:04:30
【问题描述】:

我有一个“输出类型”为“Windows 应用程序”的控制台应用程序(实现无头行为,即没有 UI,没有控制台窗口)。目的是“清理” Windows 剪贴板中的文本,即修剪所有前导和尾随空格并删除格式。

它在调试时效果很好,但是当我从资源管理器中运行它时,它只会清除剪贴板内容。

这是我的代码:

[STAThread]
internal static void Main(string[] args)
{
    var currentClipboardText = System.Windows.Clipboard.GetText();

    // only if the clipboard has text; leave any other content intact.
    if(!string.IsNullOrEmpty(currentClipboardText))
    {
        currentClipboardText = currentClipboardText.Trim();
        var pattern =  @"[\t\r\n\v\f\u2028\u2029]"; // match vert. whitesp & tabs
        currentClipboardText = Regex.Replace(currentClipboardText, pattern, " "); 
        System.Windows.Clipboard.SetDataObject(currentClipboardText);                
    }
}

MS Word 格式的输入示例,复制到剪贴板:

在调试器中运行程序后(无论是“调试”模式还是“发布”模式,都没有区别),下面是从剪贴板粘贴回 Word 的结果:

如果我做同样的练习,但通过在 Windows 资源管理器中双击它来运行程序(即在 \bin\Debug 目录中),剪贴板上将没有文本可粘贴到 Word 中:

这里有什么区别?为什么它不能在 Visual Studio 之外工作?

【问题讨论】:

    标签: c# .net visual-studio .net-4.5 clipboard


    【解决方案1】:

    默认情况下,当应用程序退出时,使用 SetDataObject 放置在系统剪贴板上的数据会自动从剪贴板中清除。

    MSDN

    使用System.Windows.Clipboard.SetDataObject(currentClipboardText, true); 在应用程序退出后将数据保留在剪贴板中。

    【讨论】:

    • 有趣。现在我想我的问题是:为什么在调试时清楚?
    • @adv12 -- 但它在子进程中,对吧?
    • 现在随着更改,应用程序在从资源管理器运行时崩溃。在 VS 调试中仍然可以正常工作。
    • @roryap 只是为了增加一些混乱:我的视觉工作室(2015)不保留剪贴板数据
    • @roryap 剪贴板操作可以被外部阻止。您可能应该打印出您收到的异常并将其发布在这里
    【解决方案2】:

    我已经测试了你的代码,调试时它不起作用。我换行了:

    System.Windows.Clipboard.SetDataObject(currentClipboardText);

    与:

    System.Windows.Clipboard.SetText(currentClipboardText);

    它在调试和不调试时都有效。我认为正在发生的事情是 Word 不再将 DataObject 识别为可粘贴文本。

    我希望这能解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-09
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多