示例:WPF监视剪贴板

用途:用于监视系统剪贴板


步骤:


系统API

        /// <summary>
        /// 剪贴板内容改变时API函数向windows发送的消息
        /// </summary>
        const int WM_CLIPBOARDUPDATE = 0x031D;

        /// <summary>
        /// windows用于监视剪贴板的API函数
        /// </summary>
        /// <param name="hwnd">要监视剪贴板的窗口的句柄</param>
        /// <returns>成功则返回true</returns>
        [DllImport("user32.dll")]//引用dll,确保API可用
        public static extern bool AddClipboardFormatListener(IntPtr hwnd);

        /// <summary>
        /// 取消对剪贴板的监视
        /// </summary>
        /// <param name="hwnd">监视剪贴板的窗口的句柄</param>
        /// <returns>成功则返回true</returns>
        [DllImport("user32.dll")]//引用dll,确保API可用
        public static extern bool RemoveClipboardFormatListener(IntPtr hwnd);


注册监视剪贴板改变API

        /// <summary> WPF窗口重写 </summary>
        protected override void OnSourceInitialized(EventArgs e)
        {

            base.OnSourceInitialized(e);

            this.win_SourceInitialized(this, e);

            // HTodo  :添加剪贴板监视 
            System.IntPtr handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;

            AddClipboardFormatListener(handle);

        }


        /// <summary> 添加监视消息 </summary>
        void win_SourceInitialized(object sender, EventArgs e)
        {

            HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;

            if (hwndSource != null)
            {
                hwndSource.AddHook(new HwndSourceHook(WndProc));
            }

        }

        /// <summary> 剪贴板内容改变 </summary>
        void OnClipboardChanged()
        {
            // HTodo  :复制的文件路径 
            string text = System.Windows.Clipboard.GetText();

            if (!string.IsNullOrEmpty(text))
            {
                if (this._viewModel.ClipBoradSource.Count > 0)
                {
                    ClipBoradBindModel last = this._viewModel.ClipBoradSource.First();

                    if (last.Detial != text)
                    {
                        ClipBoradBindModel f = new ClipBoradBindModel(text, ClipBoardType.Text);
                        this._viewModel.ClipBoradSource.Insert(0, f);
                    }
                }
                else
                {
                    ClipBoradBindModel f = new ClipBoradBindModel(text, ClipBoardType.Text);
                    this._viewModel.ClipBoradSource.Insert(0, f);
                }
            }


            // HTodo  :复制的文件 
            System.Collections.Specialized.StringCollection list = System.Windows.Clipboard.GetFileDropList();

            foreach (var item in list)
            {
                if (Directory.Exists(item) || File.Exists(item))
                {
                    if (this._viewModel.ClipBoradSource.Count > 0)
                    {
                        ClipBoradBindModel last = this._viewModel.ClipBoradSource.First();

                        if (last.Detial != item)
                        {
                            ClipBoradBindModel f = new ClipBoradBindModel(item, ClipBoardType.FileSystem);
                            this._viewModel.ClipBoradSource.Insert(0, f);
                        }
                    }
                    else
                    {
                        ClipBoradBindModel f = new ClipBoradBindModel(item, ClipBoardType.FileSystem);
                        this._viewModel.ClipBoradSource.Insert(0, f);
                    }


                }
            }

            //// HTodo  :复制的图片 
            //BitmapSource bit = System.Windows.Clipboard.GetImage();

            //if (bit != null)
            //{
            //    if (this._viewModel.ClipBoradSource.Count > 0)
            //    {
            //        ClipBoradBindModel last = this._viewModel.ClipBoradSource.First();

            //        if (last.Detial != bit.ToString())
            //        {
            //            ClipBoradBindModel f = new ClipBoradBindModel(bit.ToString(), ClipBoardType.Image);
            //            this._viewModel.ClipBoradSource.Insert(0, f);
            //        }
            //    }
            //    else
            //    {
            //        ClipBoradBindModel f = new ClipBoradBindModel(bit.ToString(), ClipBoardType.Image);
            //        this._viewModel.ClipBoradSource.Insert(0, f);
            //    }


            //}

        }

        Action ClipboardChangedHandle;

       #region - 系统消息 -

        protected virtual IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            switch (msg)
            {
                case WM_CLIPBOARDUPDATE:
                    {
                        if (isclipDoubleClick <= 0)
                        {
                            if (ClipboardChangedHandle != null)
                            {
                                // HTodo  :触发剪贴板变化事件 
                                ClipboardChangedHandle.Invoke();
                            }
                        }

                        isclipDoubleClick--;
                    }
                    break;
            }

            return IntPtr.Zero;
        }

        #endregion


示例:



猜你喜欢

转载自blog.csdn.net/u010975589/article/details/61198770
今日推荐