C#实时监测剪贴板

前言:

 

由于项目需要模仿迅雷,在程序开启时监测粘贴板是否有复制符合条件的下载地址。于是使用C#实现了该功能,下面分享相关经验及代码。

 

        #region 监视粘贴板

        /// <summary>
        /// 要处理的 WindowsSystem.Windows.Forms.Message。
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref 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;
            }
        }
        /// <summary>
        /// 显示剪贴板内容
        /// </summary>
        public void DisplayClipboardData()
        {
            try
            {
                IDataObject iData = new DataObject();
                iData = Clipboard.GetDataObject();
                if (iData == null)
                {
                    downloadPath = "";
                }
                else
                {
                    if (iData.GetDataPresent(DataFormats.Rtf))
                        downloadPath = (string)iData.GetData(DataFormats.Rtf);
                    else if (iData.GetDataPresent(DataFormats.Text))
                        downloadPath = (string)iData.GetData(DataFormats.Text);
                    else
                        downloadPath = "[Clipboard data is not RTF or ASCII Text]";


                    string DownloadUrl = downloadPath;


                    if (DownloadUrl.Length < 112)
                    {
                        downloadPath = "";
                    }
                    else
                    {
                        int start = 1, length = 48;
                        string uri = DownloadUrl.Substring(start - 1, length);
                        if (uri == "http://obs-8bc5.obs.cidc-rp-12.joint.cmecloud.cn")
                        {
                            DataSet dsNodeName = UploadBLL.Select("select settingPath from dbSettings where ID='1'");
                            string dtPath = dsNodeName.Tables[0].Rows[0]["settingPath"].ToString();
                            LoginPrama.settings = dtPath;

                            //下载嵌套线程开启
                            Thread ThreadDownload = new Thread(new ParameterizedThreadStart(download_Thread));
                            downThreadArray.Add(ThreadDownload);
                            ThreadDownload.Priority = ThreadPriority.Normal;
                            ThreadDownload.Start(DownloadUrl);
                        }
                        else
                        {
                            downloadPath = "";
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        public void download_Thread(object path)
        {
            AddBatchDownload(path.ToString());
        }

        /// <summary>
        /// 关闭程序,从观察链移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        {
            ChangeClipboardChain(Handle, nextClipboardViewer);
        }

        #region WindowsAPI
        /// <summary>
        /// 将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口
        /// </summary>
        /// <param name="hWndNewViewer">句柄</param>
        /// <returns>返回剪贴板观察器链中下一个窗口的句柄</returns>
        [DllImport("User32.dll")]
        protected static extern int SetClipboardViewer(int hWndNewViewer);

        /// <summary>
        /// 从剪贴板链中移出的窗口句柄
        /// </summary>
        /// <param name="hWndRemove">从剪贴板链中移出的窗口句柄</param>
        /// <param name="hWndNewNext">hWndRemove的下一个在剪贴板链中的窗口句柄</param>
        /// <returns>如果成功,非零;否则为0。</returns>
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

        /// <summary>
        /// 将指定的消息发送到一个或多个窗口
        /// </summary>
        /// <param name="hwnd">其窗口程序将接收消息的窗口的句柄</param>
        /// <param name="wMsg">指定被发送的消息</param>
        /// <param name="wParam">指定附加的消息特定信息</param>
        /// <param name="lParam">指定附加的消息特定信息</param>
        /// <returns>消息处理的结果</returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

需要源码的可以评论留下邮箱!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章