Build a ClipBoard Manager using Winforms
Olabamiji Oyetubo

Olabamiji Oyetubo @bigboybamo

About: Software Engineer | C# | .NET

Location:
Remote
Joined:
May 16, 2020

Build a ClipBoard Manager using Winforms

Publish Date: Mar 23
8 2

If like me, you're a Software developer, you probably do a lot of copying and pasting. While in the zone working, you might copy several items and then struggle to recall where you copied a previous item from. Windows stores these copied items in its clipboard manager, but there's no built-in way to view your clipboard history. While extensions exist to solve this problem, I prefer creating my own solution, so that's what we're going to do today.

First, create a new Winforms (.NET Framework) project.

Create Project

Name your project ClipBoardManager and click Create

Scaffolded Project

Now, in the default form, add a new ListBox item. This will store the list of copied items.

ClipBoard ListBox

Rename the listBox1 item as ClipBoardList.

Rename ListBox

Next, create a class Helper that will store our clip board logic.

Helper Class

Replace the code in Helper with the below code;

 public class Helper : Form
 {
     [DllImport("user32.dll")]
     private static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

     [DllImport("user32.dll")]
     private static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

     private IntPtr nextClipboardViewer;

     public event Action<string> ClipboardUpdated;

     public Helper()
     {
         nextClipboardViewer = SetClipboardViewer(this.Handle);
     }

     protected override void WndProc(ref Message m)
     {
         const int WM_DRAWCLIPBOARD = 0x0308;

         if (m.Msg == WM_DRAWCLIPBOARD)
         {
             if (Clipboard.ContainsText())
             {
                 string text = Clipboard.GetText();
                 ClipboardUpdated?.Invoke(text);
             }
         }

         base.WndProc(ref m);
     }
 }
Enter fullscreen mode Exit fullscreen mode

We're using the Windows API (User32.dll) to detect changes in our environment. WM_DRAWCLIPBOARD listens for clipboard activity and extracts the text using a triggered event anything something is copied.

Now, in Form1, add the code below;

public partial class Form1: Form
{
    public Form1()
    {
        InitializeComponent();

        clipboardHelper = new Helper();
        clipboardHelper.ClipboardUpdated += OnClipboardChange;
    }

    private Helper clipboardHelper;
    private List<string> clipboardHistory = new List<string>();

    private void OnClipboardChange(string text)
    {
        if (!clipboardHistory.Contains(text))
        {
            if (clipboardHistory.Count >= 10)
                clipboardHistory.RemoveAt(0);

            clipboardHistory.Add(text);
            UpdateClipBoardList();
        }
    }

    private void UpdateClipBoardList()
    {
        ClipBoardList.Items.Clear();
        foreach (var item in clipboardHistory)
            ClipBoardList.Items.Add(item);
    }
}
Enter fullscreen mode Exit fullscreen mode

This initializes a new Helper class called clipboardHelper and then assigns ClipboardUpdated action to a new method OnClipboardChange. This method simply utilizies the UpdateClipBoardList method to update our ClipBoardList ListBox item.

And that's it. When you run the code, you get a simple UI, all you have to do is then copy a piece of text and it appears in our list.

Final Result

If you got lost somewhere along the line, the entire project can be found here

Comments 2 total

  • Sasha
    SashaMar 25, 2025

    Very nice write up. I'm surprised you used WinForms though. Either way, thanks for sharing!

    • Olabamiji Oyetubo
      Olabamiji OyetuboMar 25, 2025

      I use windows, so it just made sense for me to use the most windows compatible solution 😃

Add comment