C# 2.0 中怎么监视剪贴板的动作,比如当将数据放入剪贴板时执行我的代码,对剪贴板中的数据进行查看,是否是指定的格式.

解决方案 »

  1.   

    [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;
        
            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;
                }    
                }
        
                    private void Form1_Closed(object sender, System.EventArgs e)
            {
                ChangeClipboardChain(this.Handle,NextClipHwnd);
                //从观察链中删除本观察窗口
                SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,this.Handle,NextClipHwnd);
                //将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口        
                }
        
            void DisplayClipboardData()        
            {
                try
                {
                    IDataObject iData = new DataObject();  
                    iData = Clipboard.GetDataObject();                if (iData.GetDataPresent(DataFormats.Rtf)) 
                        richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);
                    else if (iData.GetDataPresent(DataFormats.Text))
                        richTextBox1.Text = (string)iData.GetData(DataFormats.Text);
                    else
                        richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                }