Skip to content

New UWP working Notification class  #1

Description

@Hantick

Hello, I've remixed a Notification.cs class to work with UWP projects, If you're interested I could push it to seperate branch.

using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace ClipboardTools
{
    /// <summary>
    /// Provides notifications when the contents of the clipboard is updated.
    /// From: https://stackoverflow.com/questions/621577/clipboard-event-c-sharp
    /// </summary>
    public sealed class UWPNotification
    {
        /// <summary>
        /// Occurs when the contents of the clipboard is updated.
        /// </summary>
        public static event EventHandler ClipboardUpdate;

        private static NotificationWindow _window;
        public UWPNotification(HwndSource source)
        {
            _window = new NotificationWindow(source);
        }

        /// <summary>
        /// Raises the <see cref="ClipboardUpdate"/> event.
        /// </summary>
        /// <param name="e">Event arguments for the event.</param>
        private static void OnClipboardUpdate(EventArgs e)
        {
            var handler = ClipboardUpdate;
            if (handler != null)
            {
                handler(null, e);
            }
        }

        /// <summary>
        /// Hidden window to recieve the WM_CLIPBOARDUPDATE message.
        /// It gets HwndSource from main window, necessary handler to make Notification class work.
        /// </summary>
        private partial class NotificationWindow : Window
        {
            public NotificationWindow(HwndSource source)
            {
                NativeMethods.AddClipboardFormatListener(source.Handle);
                source.AddHook(WndProc);
            }

            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                if (msg == NativeMethods.WM_CLIPBOARDUPDATE)
                {
                    OnClipboardUpdate(null);
                }

                return IntPtr.Zero;
            }
        }
    }

    internal static class NativeMethods
    {
        // See http://msdn.microsoft.com/en-us/library/ms649021%28v=vs.85%29.aspx
        public const int WM_CLIPBOARDUPDATE = 0x031D;
        public static IntPtr HWND_MESSAGE = new IntPtr(-3);

        // See http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool AddClipboardFormatListener(IntPtr hwnd);

        // See http://msdn.microsoft.com/en-us/library/ms633541%28v=vs.85%29.aspx
        // See http://msdn.microsoft.com/en-us/library/ms649033%28VS.85%29.aspx
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
    }

}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions