using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace BrokerInterfaceETrade { public sealed class ClipboardNotification : IDisposable { public const int WM_CLIPBOARDUPDATE = 0x031D; public static IntPtr HWND_MESSAGE = new IntPtr(-3); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool AddClipboardFormatListener(IntPtr hwnd); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool RemoveClipboardFormatListener(IntPtr hwnd); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); public event EventHandler ClipboardUpdate; private readonly NotificationForm _form; public ClipboardNotification() { _form = new NotificationForm(OnClipboardUpdate); } private void OnClipboardUpdate() { ClipboardUpdate?.Invoke(null, EventArgs.Empty); } private class NotificationForm : Form { private readonly Action _onClipboardUpdate; public NotificationForm(Action onClipboardUpdate) { _onClipboardUpdate = onClipboardUpdate; SetParent(Handle, HWND_MESSAGE); AddClipboardFormatListener(Handle); } protected override void WndProc(ref Message m) { if (m.Msg == WM_CLIPBOARDUPDATE) _onClipboardUpdate?.Invoke(); base.WndProc(ref m); } } private void ReleaseUnmanagedResources() { RemoveClipboardFormatListener(_form.Handle); } public void Dispose() { ReleaseUnmanagedResources(); GC.SuppressFinalize(this); } ~ClipboardNotification() { ReleaseUnmanagedResources(); } } }