• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2632
  • Last Modified:

Windows Cut/Copy/Paste Event Handle using .NET

I want to develop a software which will monitor the file windows cut/copy/paste events like TeraCopy does. How to do this.
Please provide some sample code.
Thank you
0
Amitava_Mukherjee
Asked:
Amitava_Mukherjee
  • 4
  • 2
  • 2
  • +1
2 Solutions
 
Amitava_MukherjeeAuthor Commented:
The solution seems for a grid not to trap the Windows Paste event.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You'd need to write a shell/namespace extension to do that...
http://blogs.msdn.com/b/codefx/archive/2010/09/14/writing-windows-shell-extension-with-net-framework-4-c-vb-net-part-1.aspx
http://msdn.microsoft.com/en-us/library/bb776905(VS.85).aspx

Not a "simple" thing by any means...and it's horribly un-documented...

*and I've never done it.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
Amitava_MukherjeeAuthor Commented:
I'm using .NEt 3.5, so can you provide some framework 3.5 code.
Thank You
0
 
Todd GerbertIT ConsultantCommented:
You can use the Windows API SetClipboardViewer to register to receive a Windows Message when something is copied to the clipboard; you can then use the .Net Clipboard class to retrieve it.
This simple example uses a class that derives from NativeWindow, registers itself as a "message-only" window, and overrides the WndProc method in order to handle the WM_DRAWCLIPBOARD and WM_CHANGECBCHAIN messages.  You could use it in your code a la:
ClipboardMonitor cbMonitor = new ClipboardMonitor();
cbMonitor.ClipboardCopyEvent += new EventHandler(cbMonitor_ClipboardCopyEvent);
private void cbMonitor_ClipboardCopyEvent(object sender, EventArgs e)
{
    MessageBox.Show("Something was copied to the clipboard.");
}

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ClipboardMonitor
{
	public enum WindowsMessages : int
	{
		DRAWCLIPBOARD = 0x308,
		CHANGECBCHAIN = 0x30d
	}

	public class ClipboardMonitor : NativeWindow, IDisposable
	{
		[DllImport("user32.dll")]
		private static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
		[DllImport("user32.dll", CharSet = CharSet.Auto)]
		private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
		[DllImport("user32.dll")]
		private static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

		private readonly IntPtr HWND_MESSAGE = new IntPtr(-3);

		private bool disposed = false;
		private IntPtr nextClipboardWindow;

		public event EventHandler ClipboardCopyEvent;

		public ClipboardMonitor()
		{
			this.CreateHandle(new CreateParams() { Parent = HWND_MESSAGE });
			nextClipboardWindow = SetClipboardViewer(this.Handle);
		}

		~ClipboardMonitor()
		{
			Dispose(false);
		}

		private void Dispose(bool disposing)
		{
			if (!disposed)
			{
				disposed = true;
				ChangeClipboardChain(this.Handle, nextClipboardWindow);
			}
		}

		public void Dispose()
		{
			Dispose(true);
			GC.SuppressFinalize(this);
		}

		protected virtual void OnClipboardCopyEvent(EventArgs e)
		{
			if (ClipboardCopyEvent != null)
				ClipboardCopyEvent(this, e);
		}

		protected override void WndProc(ref Message m)
		{
			switch ((WindowsMessages)m.Msg)
			{
				case WindowsMessages.DRAWCLIPBOARD:
					if (nextClipboardWindow != null)
						SendMessage(nextClipboardWindow, (uint)m.Msg, m.WParam, m.LParam);
					OnClipboardCopyEvent(new EventArgs());
					break;
				case WindowsMessages.CHANGECBCHAIN:
					if (m.LParam != this.Handle)
					{
						if (m.LParam == nextClipboardWindow)
							nextClipboardWindow = m.LParam;
						else
							SendMessage(nextClipboardWindow, (uint)m.Msg, m.WParam, m.LParam);
					}
					m.Result = IntPtr.Zero;
					break;
			}
			base.WndProc(ref m);
		}
	}
}

Open in new window

0
 
Amitava_MukherjeeAuthor Commented:
How to handle the Paste event through code.
Thank you.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
With SetClipboardViewer()?...you can't.  All that does is give you a way to determine when something has been copied to the clipboard...
0
 
Todd GerbertIT ConsultantCommented:
If you want to kow if something's been pasted into one of your windows you can override WndProc and catch the WM_PASTE message.  If you want to know if something's been pasted anywhere, you would need to use a native C++ DLL and the SetWindowsHookEx() API to be notified of a WM_PASTE message posted to any window.
0
 
Amitava_MukherjeeAuthor Commented:
Thanx
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

  • 4
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now