65.9K
CodeProject is changing. Read more.
Home

Add-in Word - Simple Paste PrintScreen

May 13, 2013

CPOL
viewsIcon

10663

Add-in Word for PrintScreen

Introduction

The purpose of this article is creating an Add-In for Word that automates logging printscreens.

Background

This add-in was designed to facilitate the creation of manuals, registration testing and other tasks where it is used very printscreen. 

Creating the code 

First create a Word 2007 Add-in solution, like this: 

Creating the Code Add-In   

After solution create, let's create a button:  

//
// Any source code blocks look like this
//
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
   CheckIfMenuBarExists();
   AddMenuBar();
}
 
//
// Checks whether there is a button with id equal to 200
//
private void CheckIfMenuBarExists()
{
   try
   {
    Office.CommandBarButton foundMenu = (Office.CommandBarButton)
        this.Application.CommandBars.ActiveMenuBar.FindControl(
          Office.MsoControlType.msoControlButton, System.Type.Missing, 200, true, true);
 
    if (foundMenu != null)
    {
        foundMenu.Delete(true);
    }
   }
   catch (Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
}
 
//
// Add button with caption 'Monitor PrintScreen'
//
private void AddMenuBar()
{
   try
   {
    Office.CommandBar menubar = (Office.CommandBar)Application.CommandBars.ActiveMenuBar;
 
    // Add the menu.                
    menuCommand = (Office.CommandBarButton)menubar.Controls.Add(
           Office.MsoControlType.msoControlButton, missing, missing, missing, true);
    menuCommand.Style = MsoButtonStyle.msoButtonIconAndWrapCaptionBelow;
    menuCommand.Caption = "Monitor PrintScreen";
    menuCommand.Tag = "200";
    menuCommand.FaceId = 65;
    menuCommand.Click += new _CommandBarButtonEvents_ClickEventHandler(menuCommand_Click);                        
   }
   catch (Exception e)
   {
    MessageBox.Show(e.Message);
   }
}

Clipboard Monitor

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
 
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
 
private const int WM_DRAWCLIPBOARD = 0x0308;// WM_DRAWCLIPBOARD message
private IntPtr _clipboardViewerNext;
 
public delegate void ClipboardHandler(object sender, ClipboardArgs e);
public event ClipboardHandler OnNewClipboard;
 
public ClipboardManager()
{
    InitializeComponent();
}
 
public void Start()
{
    _clipboardViewerNext = SetClipboardViewer(this.Handle);
}
 
public void Stop()
{
    ChangeClipboardChain(this.Handle, _clipboardViewerNext);
}
 
protected override void WndProc(ref Message m)
{
   base.WndProc(ref m);    
   if (m.Msg == WM_DRAWCLIPBOARD)
   {
    IDataObject iData = Clipboard.GetDataObject();      
 
    if (iData.GetDataPresent(DataFormats.Bitmap))
    {
        Bitmap image = (Bitmap)iData.GetData(DataFormats.Bitmap);
        
        if (OnNewClipboard != null)
        {                        
            OnNewClipboard(this, new ClipboardArgs(image));
        }
    }
    }
}
 
public class ClipboardArgs
{
   public ClipboardArgs(Bitmap image)
   {
    this.Image = image;
   }
   
   public Bitmap Image { get; set; }
 
}

Inclusion of the new image in the document

void manager_OnNewClipboard(object sender, ClipboardArgs e)
{
        Application.ActiveDocument.Content.Paragraphs.Add(
          Globals.ThisAddIn.Application.Selection.Range);
 
    Globals.ThisAddIn.Application.Selection.Paste();
    Application.ActiveDocument.Content.Paragraphs.Add(
      Globals.ThisAddIn.Application.Selection.Range);

    Globals.ThisAddIn.Application.Selection.MoveDown(WdUnits.wdParagraph, 2, Type.Missing);
}

Result of this code

After clicking the button, all the print screens will be included in the Word document. 

Points of Interest

In this article learn how to create:

  • An Add-in for Word 2007.
  • A monitor area transfer.

History

  • 12th March, 2013: Article published.