Вставьте текст в активное окно Word с помощью С#

Я разрабатываю приложение, которое будет получать данные через COM-порт и должно вставить их в программу Microsoft Office (пока что я работаю с Word, но он будет поддерживать Excel, PowerPoint, ...).

Я подумал, что хорошей идеей было бы скопировать эти данные в буфер обмена, а затем вставить их в любое открытое окно приложения (так, например, приложения LibreOffice и Блокнот работают отлично). Для этого я закодировал:

if (booleanIncomingData)
{
    booleanCopy = true;
}
else if (booleanOutcomingData)
{
    copy = false;
}
if (copy)
{
    Clipboard.SetText(myString);
}
else
{
    SendKeys.Send("^V");
    SendKeys.Send("{ENTER}");
}

Как я уже сказал, программы LibreOffice и Блокнот работают отлично, но Word и Excel не делают того, что, как я думал, они должны делать (в основном отображают какие-либо данные, а затем переходят к следующей строке).

Кроме того, простой

Clipboard.GetText()ç

не работает (и я чувствую, что он пытается вставить содержимое в активное окно.

Поиск решений Interop.Word через Интернет пока не увенчался успехом. У кого-нибудь есть идея, что я могу сделать или где я должен искать? Должен ли я внедрить надстройку Office вместо обычного приложения Win32?

В случае, если необходима какая-либо другая информация, пожалуйста, не стесняйтесь запрашивать ее.

Сезар.


person Cesinha    schedule 25.11.2013    source источник
comment
Взгляните на основные сборки взаимодействия.   -  person Brian    schedule 25.11.2013


Ответы (1)


Все оказалось намного сложнее, чем я думал. Но мое текущее приложение теперь работает с несколькими программами (Word, Excel, Notepad, LibreOffice, ...).

КОПИРОВАНИЕ/ВСТАВКА ДАННЫХ

  • stackoverflow.com/questions/3546016/как копировать данные в буфер обмена в c-sharp
  • msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

ПОЛУЧИТЬ АКТИВНОЕ ОКНО

  • www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/
  • stackoverflow.com/questions/893669/определить, является ли программа активным окном в сети
  • stackoverflow.com/questions/2635404/how-to-get-process-name-and-title-of-the-top-window-on-windows-c-sharp

МАЙКРОСОФТ ОФИС

  • hubpages.com/hub/How-To-Program-with-Excel-and-C-using-a-Ribbon
  • msdn.microsoft.com/en-us/library/vstudio/6b9478cs.aspx
  • stackoverflow.com/questions/13403504/send-text-to-excel-sheet-using-winapi
  • stackoverflow.com/questions/2378206/how-to-get-current-or-focussed-cell-value-in-excel-worksheet-using-c-sharp

В целом, приложения Microsoft Office были более громоздкими, и, как предположил @Brian, PIA (Primary Interop Assembles) сыграли решающую роль в этой задаче.

person Cesinha    schedule 29.11.2013
comment
Как вы заставили слово работать? Это работало в большинстве приложений, но не в приложениях Office, как вы указываете. Вы обнаруживаете слово и действуете по-другому, и автоматизируете? - person Scott Hanselman; 09.01.2014
comment
@ScottHanselman в основном следовал по ссылкам, которые я предоставил ... где именно вы застряли? В более высокоуровневой абстракции нужно было обнаружить активное окно, убедиться, что это WinWord, затем поместить нужные данные в буфер обмена и, наконец, отправить команду CTRL+V. - person Cesinha; 09.01.2014
comment
А, я делаю WM_PASTE так: IntPtr hWnd = GetFocusedHandle(); PostMessage(hWnd, WM_PASTE, IntPtr.Zero, IntPtr.Zero); Попробую сделать SendKeys. - person Scott Hanselman; 09.01.2014
comment
Странно... Я убедился, что Word находится впереди и курсор там, но Word (в Windows 8.1 и Word 2013) просто игнорирует Ctrl-V. Для чего вы используете PIA? Вы автоматизируете Word с его COM API через PIA или принимаете Ctrl-V? - person Scott Hanselman; 09.01.2014
comment
Хорошо, это фрагмент моего старого кода: pastebin.com/BGYMjtcw Я решил через некоторое время , что отправка SendKeys.Send() в любое активное окно будет намного эффективнее для того, что я преследовал. - person Cesinha; 10.01.2014
comment
@ScottHanselman У вас когда-нибудь это работало? Я пытаюсь создать что-то подобное, но я не хочу привязывать его к каким-либо офисным приложениям. - person James Allman; 13.03.2014
comment
Да, и упрощенным решением было использовать метод SendKeys.Send(): msdn.microsoft.com/en-us/library/ - person Cesinha; 19.03.2014
comment
Спасибо, вы можете отформатировать свои ссылки и поместить некоторые фрагменты кода. В любом случае, спасибо - person FindOutIslamNow; 11.06.2018