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
Top comments (2)
Very nice write up. I'm surprised you used WinForms though. Either way, thanks for sharing!
I use windows, so it just made sense for me to use the most windows compatible solution 😃