监视剪贴板(转)

监视剪贴板

使用一些下载工具比如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());             }             }

时间: 2024-09-17 10:05:11

监视剪贴板(转)的相关文章

WIN7下使用.net(C#)监视剪贴板 (转)

最近需要做一个小程序,需要常驻后台,监视剪贴板变化并提取内容, 在网上查了一些资料,先采用SetClipboardViewer方法实现,具体原理可以参考http://www.cnblogs.com/jht/archive/2006/03/20/354088.html,我的程序中使用的是http://code.google.com/p/clipboardviewer/提供的ClipboardChangeNotifier.cs类,比较方便,类代码见附件(在google code中下载或http://

剪切板-监视剪贴板

相关资料: http://user.qzone.qq.com/513187410/blog/1265981516 实例原码: 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls, ExtCtrls, 8 Clipbrd, jpeg; //Clipboard使用 9 10 type 1

监视剪贴板数据

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, clipbrd, StdCtrls, ComCtrls, Menus, ExtCtrls, ToolWin; type TForm1 = class(TForm) MainMenu1: TMainMenu; ToolBar1: TToolBar; StatusBar1: TSt

【.net 深呼吸】监听剪贴板更新(针对Vista之后系统)

针对 XP 及以前的监视剪贴板更改的方法就不讲了,因为 XP 已严重过时.本篇老周介绍的方法面向 Vista 以上的系统. 在托管应用程序中监听剪贴板更新行为必须用到 Win 32 API ,具体做法,我先简单说一下. 首先,调用 AddClipboardFormatListener 函数来向窗口注册监听行为,它需要一个窗口句柄作为传入参数,该句柄所指的窗口即是监听剪贴板更新的窗口. 然后,当剪贴板的内容被更新,处理程序会收到一条 WM_CLIPBOARDUPDATE 消息.我们在应用程序中,只

用 CentOS 7 打造合适的科研环境

这篇博文记录了我用 CentOS 7 搭建 地震学科研环境 的过程,供我个人在未来重装系统时参考.对于其他地震学科研人员,也许有借鉴意义. 阅读须知: 本文适用于个人电脑,不适用于服务器: 不推荐刚接触 Linux 的人使用 CentOS 发行版: 本文尽量写的浅显易懂,但要求读者掌握 Linux 基础知识: 本文所有操作均在 CentOS 7 下完成,其他发行版或多或少与 CentOS 7 不同,因而仅供参考: 本文所安装的软件纯粹出于个人习惯及喜好,读者应自己判断,按需安装: 安装 Cent

跟我一起玩Win32开发(转自CSDN-东邪独孤)

跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩Win32开发(5):具有单选标记的菜单 跟我一起玩Win32开发(6):创建右键菜单 跟我一起玩Win32开发(7):多边形窗口 跟我一起玩Win32开发(8):绘图(A) 跟我一起玩Win32开发(9):绘图(B) 跟我一起玩Win32开发(10):绘图(C) 跟我一起玩Win32开发(11):使

开源软件收集

http://www.7-zip.org/7-Zip 4.16 Beta : 文件压缩工具,可与Windows资源管理器集成http://a-note.sourceforge.net/A Note 4.2.1 : 可在Windows桌面放置便笺,并可提供闹钟提醒功能http://www.xs4all.nl/~edienskeAbakt 0.9 : 能够以压缩方式对文档进行备份http://www.abisource.com/Abiword 2.27 : Windows写字板的替代程序,功能有所加

应用 EditPlus 配置 Java 编译环境

EditPlus(文字编辑器)一套功能强大,可取代记事本的文字编辑器,EditPlus拥有无限制的撤消与重做.英文拼字检查.自动换行.列数标记.搜寻取代.同时编辑多文件.全屏幕浏览功能.而它还有一个好用的功能,就是它有监视剪贴板的功能,能够同步于剪贴板自动将文字粘贴进 EditPlus 的编辑窗口中,让你省去粘贴的步骤.另外它也是一个非常好用的 HTML 编辑器,它除了支持颜色标记.HTML 标记,同时支持 C.C++.Perl.Java,另外,它还内建完整的HTML & CSS1 指令功能,对

如何使用迅雷下载电骡的资源

1 使用火狐浏览器右击点击查看元素 2 右击复制HTML并粘贴到任意编辑器 3 把name值括号里面的东西复制,然后使用迅雷下载即可(一般迅雷会监视剪贴板自动弹出下载对话框)