Поставете текст в активен прозорец на Word с помощта на c#

Разработвам приложение, което ще получава данни през COM порт и трябва да го постави в програма на Microsoft Office (засега работя с Word, но ще поддържа Excel, PowerPoint, ...).

Помислих си, че добра идея би било да копирате тези данни в клипборда, след което да ги поставите в прозореца на което и да е отворено приложение (така че например приложенията на LibreOffice и Notepad работят перфектно). За това съм кодирал:

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

Както казах, програмите на LibreOffice и Notepad работят перфектно, но Word и Excel не правят това, което смятах, че трябва (по принцип показват всякакви данни, след което преминават към следващия ред).

Също така, прост

Clipboard.GetText()ç

не работи (и усещането ми е, че се опитва да постави съдържанието в активния прозорец.

Търсенето на решения за Interop.Word в мрежата не е имало успех досега. Някой има ли идея какво мога да направя или къде да търся? Вместо обикновено Win32 приложение, трябва ли да внедря добавка за Office?

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

Сезар.


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


Отговори (1)


Стана много по-сложно, отколкото си мислех. Но текущото ми приложение вече работи с няколко софтуера (Word, Excel, Notepad, LibreOffice, ...).

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

  • stackoverflow.com/questions/3546016/how-to-copy-data-to-clipboard-in-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/determine-whether-program-is-the-active-window-in-net
  • stackoverflow.com/questions/2635404/how-to-get-process-name-and-title-of-the-top-window-on-windows-c-sharp

MICROSOFT OFFICE

  • 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 (Prmary Interop Assemblies) бяха от решаващо значение за тази задача.

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