The original article can be found here

Introduction
This article explains how we can use Microsoft Word in our .NET application. This will enable you to use your favorite word-processor within your .NET application.
Background
I had been working on migrating and improving different transcription workflow applications (medical and legal) in .NET. The biggest problem that these transcriptionists faced while transcribing was that of the editor. All of them used an HTML editor which is a part of the Windows Form application. In the period of 4-5 years of its usage, the clients started using MS-Word. Therefore they wanted us to send Word documents as output, instead of the HTML documents sent earlier. The workflow was changed by doing this manually. We wanted to have a Word control similar to the HTML editor to become a part of the application. Unfortunately, there is no such way to do that.
While searching at Google, I came across a project which showed the trick of making any window a part of your application. This article is based on the article posted at CodeProject. Just when I was writing this article, I found another article suggesting the same trick.
Using the code
I would highly recommend reading the base-article mentioned in the Background section.
When we contain a window within our application, we do not want the window to be allowed to close through its Close (X) button. Similarly, we do not want the Minimize, Maximize and Restore buttons to work.
One way to solve this problem is to hide the title bar. This can be done by using the SystemInformationn
class, as shown below:
int borderWidth = SystemInformation.Border3DSize.Width;
int borderHeight = SystemInformation.Border3DSize.Height;
int captionHeight = SystemInformation.CaptionHeight;
int statusHeight = SystemInformation.ToolWindowCaptionHeight;
MoveWindow(
wordWnd,
-2*borderWidth,
-2*borderHeight - captionHeight,
this.Bounds.Width + 4*borderWidth,
this.Bounds.Height + captionHeight + 4*borderHeight + statusHeight,
true);
But what would happen if the user presses "Alt+Spacebar"? This will open up the System menu for the user, where the user can select Restore, Minimize, Close, etc. We don't want even this to happen. We can disable this System menu using the Windows API. This is shown below:
int hMenu = GetSystemMenu(wordWnd,false);
if(hMenu>0)
{
int menuItemCount = GetMenuItemCount(hMenu);
RemoveMenu(hMenu, menuItemCount - 1,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 2,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 3,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 4,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 5,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 6,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 7,
MF_REMOVE | MF_BYPOSITION);
RemoveMenu(hMenu, menuItemCount - 8,
MF_REMOVE | MF_BYPOSITION);
DrawMenuBar(wordWnd);
}
You may want to have only a few command bars in the MS-Word window. E.g. you may not want the "Menu Bar" (which is also a command bar in MS-Word). This is shown below:
[Editor comment: Line breaks used to avoid scrolling.]
objWinWordControl.document.ActiveWindow.Application.
CommandBars["Menu Bar"].Enabled=false;
The "Standard" command bar in MS-Word has the "New" and "Open" buttons. We want to disable these buttons also. This can be done as shown below:
[Editor comment: Line breaks used to avoid scrolling.]
wd.ActiveWindow.Application.CommandBars["Standard"].
Controls[1].Enabled=false;
wd.ActiveWindow.Application.CommandBars["Standard"].
Controls[2].Enabled=false;
In some cases, you will need to have the "Menu Bar", but without all the sub-menu options. You can disable those options by using the CommandBarPopUp
class:
Office.CommandBarPopup c;
c = (Office.CommandBarPopup)wd.ActiveWindow
.Application
.CommandBars["Menu Bar"].Controls[0];
c.Controls["Close Window"].Enabled=false;
The attached code
The attached code is part of a larger transcription workflow. It is developed using .NET 1.1 Framework and MS-Word 2000.
In most transcription applications, you have a scenario like "Transcription --> QA1 --> QA2.....". In such cases, you will have to give an error-marking facility to the QAs. I have just shown a very basic demo. Say, when a transcript goes from QA1 to QA2, the errors marked by QA2 should not be shown. Therefore, we need to remove error-marking before displaying the transcript to QA2.
We need to have specific kinds of templates for different clients of the transcription division. These templates can be pre-configured and used to create new documents (through the "LoadDocument
" method). An example of this is shown through the "Load Document" button.
In most cases, you will require that a part of the document being transcribed be automatically filled up. E.g. the client's ID, current date, record number, etc. This kind of information comes from the database, therefore can be automatically filled up. I have accomplished this using "Bookmarks" in the Word document. A sample can be seen using the "Sample.dot" file.
You can do much more than what is shown in the attached code. Please find more about Microsoft Word Automation and Windows APIs at MSDN.
Enhancements
While this application only integrates (contains) MS-Word in a .NET application, it was quite interesting to do so with other applications as well. We did that with an audio player and found that the concept of containing windows was really useful the second time too.
The original article can be found here