2016-08-09 7 views
1

У меня есть консольное приложение с «выходным типом» «приложения Windows» (для достижения безголового поведения, то есть без интерфейса пользователя, без консольного окна). Цель состоит в том, чтобы «очистить» текст в буфере обмена Windows, т. Е. Обрезать все начальные и конечные пробелы и удалить форматирование.Почему мое приложение, управляющее буфером обмена, ведет себя по-разному, когда выполняется за пределами Visual Studio?

Он отлично работает при отладке, но когда я запускаю его из проводника, он просто очищает содержимое буфера обмена.

Вот мой код:

[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 (либо в "отладки" режим или режим «освобождения», не имеет значения), вот результат, вставленный обратно в Word из буфера обмена:

enter image description here

Если я делаю то же упражнение, но запускаю программу, дважды щелкнув по ней в проводнике Windows (т. в каталоге \bin\Debug), там не осталось в буфер обмена, чтобы вставить в слово текст:

enter image description here

Какая разница здесь? Почему он не работает за пределами Visual Studio?

ответ

2

По умолчанию данные, размещенные в системе Буфер обмена с SetDataObject, автоматически удаляется из буфера обмена, когда приложение завершает работу.

MSDN

Используйте System.Windows.Clipboard.SetDataObject(currentClipboardText, true); вместо того, чтобы сохранить данные в буфер обмена после выхода из приложения.

+0

Интересно. Теперь я догадываюсь, что мой вопрос: почему * не * это ясно при отладке? –

+0

@ adv12 - но это зависит от детского процесса, не так ли? –

+0

Теперь с изменением приложение сбой при запуске из проводника. Все еще отлично работает от отладки VS. –

0

Я проверил ваш код, и он не работает при отладке. Я изменил строку:

System.Windows.Clipboard.SetDataObject (currentClipboardText);

С:

System.Windows.Clipboard.SetText (currentClipboardText);

И он работал при отладке и при отладке. Я думаю, что происходит то, что Word больше не распознает DataObject как вставной текст.

Надеюсь, это решит вашу проблему.