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.
Name your project ClipBoardManager and click Create
Now, in the default form, add a new ListBox
item. This will store the list of copied items.
Rename the listBox1
item as ClipBoardList
.
Next, create a class Helper
that will store our clip board logic.
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);
}
}
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);
}
}
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.
If you got lost somewhere along the line, the entire project can be found here