int hWndNewViewer);  当调用SetClipboardViewer函数的时候,需要传递接收这个消息(WM_DRAWCLIPBOARD)的窗口句柄作为参数,SetClipboardViewer 返回当前观察链中下一个窗口句柄,通常程序需要保存这个值,因为我们需要把消息传递给观察链中的下一个窗口。       (2)处理WM_DRAWCLIPBOARD 消息 重载窗体的WndProc方法,处理消息,参看程序       (3)处理 WM_CHANGECBCHAIN消息,因为每个处理WM_DRAWCLIPBOARD消息的窗口必须担负把消息传递个下个观察链窗口的任务。       (4)处理WM_CHANGECBCHAIN消息,当一个窗口把自己从观察链移出时候的消息。该移出过程(程序结束时)通过调用Win32ChangeClipboardChain函数完成。 代码:
监视剪贴板(转)
    


            
监视剪贴板     监视剪贴板(转)
    


            
监视剪贴板        [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()); 监视剪贴板(转)
    


            
监视剪贴板            } 监视剪贴板(转)
    


            
监视剪贴板            }
使用一些下载工具比如FlashGet、DuDu下载器,通常有一个选项叫做监视剪贴板,如果发现指定类型的后缀名,则自动开始下载,监视剪贴板的小技巧很有实用价值。        下面就说说监视剪贴板的小技巧。        Windows系统使用list或者是chain来保存当剪贴板的数据发生变化的时候要求被通知到的一些窗口。  每一次当剪贴板的数据发生变化的时候,这个list的第一个窗口收到一个WM_DRAWCLIPBOARD系统消息, 该窗口可以查询剪贴板数据的相关信息。这个非常简单的过程,我们只要遵循下面几条说明,调用相关的win32API函数就行了。       (1)protected static extern int SetClipboardViewer(int hWndNewViewer);  当调用SetClipboardViewer函数的时候,需要传递接收这个消息(WM_DRAWCLIPBOARD)的窗口句柄作为参数,SetClipboardViewer 返回当前观察链中下一个窗口句柄,通常程序需要保存这个值,因为我们需要把消息传递给观察链中的下一个窗口。       (2)处理WM_DRAWCLIPBOARD 消息 重载窗体的WndProc方法,处理消息,参看程序       (3)处理 WM_CHANGECBCHAIN消息,因为每个处理WM_DRAWCLIPBOARD消息的窗口必须担负把消息传递个下个观察链窗口的任务。       (4)处理WM_CHANGECBCHAIN消息,当一个窗口把自己从观察链移出时候的消息。该移出过程(程序结束时)通过调用Win32ChangeClipboardChain函数完成。 代码:
监视剪贴板(转)
    


            
监视剪贴板     监视剪贴板(转)
    


            
监视剪贴板        [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()); 监视剪贴板(转)
    


            
监视剪贴板            } 监视剪贴板(转)
    


            
监视剪贴板            }

相关文章: