Da odgovorim, pa ako nađeš nešto elegantnije, slobodno postuj.
Potrebno je da importuješ sledeće
Code:
using System.Runtime.InteropServices;
Ovo smestiš negde u klasi iznad konstruktora
Code:
[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
IntPtr nextClipboardViewer;
Ovo ubaciš u konstruktor
Code:
Clipboard.Clear();
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);
Potrebno je override-ovati WndProc metodu
Code:
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// defined in winuser.h
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
I konačno metoda u kojoj radiš
nešto kada dođe do promene u clipboard-u
Code:
void DisplayClipboardData()
{
try
{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
// Ovde ide tvoj kod
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
Kao što vidiš, nema tajmera i ostališ čudesa.
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D