为什么我的剪贴板操作应用程序在Visual Studio外部运行时表现不同?

时间:2016-08-09 16:04:30

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

我的控制台应用程序带有"输出类型" " 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中格式化的示例输入,复制到剪贴板:

enter image description here

在dubugger中运行程序后(在" debug" mode或" release" mode,没有区别),这里是从剪贴板粘贴回Word的结果:

enter image description here

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

  

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

MSDN

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

答案 1 :(得分:0)

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

System.Windows.Clipboard.SetDataObject(currentClipboardText);

使用:

System.Windows.Clipboard.SetText(currentClipboardText);

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

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