Solved

Windows Cut/Copy/Paste Event Handle using .NET

Posted on 2010-09-22
9
2,303 Views
Last Modified: 2012-05-10
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
Comment
Question by:Amitava_Mukherjee
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
  • 2
  • +1
9 Comments
 
LVL 5

Expert Comment

by:roxviper
ID: 33741683
0
 

Author Comment

by:Amitava_Mukherjee
ID: 33742010
The solution seems for a grid not to trap the Windows Paste event.
0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 33746012
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
Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

 

Author Comment

by:Amitava_Mukherjee
ID: 33752131
I'm using .NEt 3.5, so can you provide some framework 3.5 code.
Thank You
0
 
LVL 33

Expert Comment

by:Todd Gerbert
ID: 33755056
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
 

Author Comment

by:Amitava_Mukherjee
ID: 33760004
How to handle the Paste event through code.
Thank you.
0
 
LVL 86

Accepted Solution

by:
Mike Tomlinson earned 250 total points
ID: 33760746
With SetClipboardViewer()?...you can't.  All that does is give you a way to determine when something has been copied to the clipboard...
0
 
LVL 33

Assisted Solution

by:Todd Gerbert
Todd Gerbert earned 250 total points
ID: 33760831
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
 

Author Closing Comment

by:Amitava_Mukherjee
ID: 33767134
Thanx
0

Featured Post

Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
In this video, we discuss why the need for additional vertical screen space has become more important in recent years, namely, due to the transition in the marketplace of 4x3 computer screens to 16x9 and 16x10 screens (so-called widescreen format). …
With the advent of Windows 10, Microsoft is pushing a Get Windows 10 icon into the notification area (system tray) of qualifying computers. There are many reasons for wanting to remove this icon. This two-part Experts Exchange video Micro Tutorial s…

737 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question