自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉。于是,老邪就拿出《九阴真经》认真阅读,同时用迅雷下载经典大剧《汉武大帝》晚上睡觉前看上几集,老邪一向是善于向古圣先贤学习。

大家知道,迅雷有一个监视剪贴板的功能,如果发现你复制剪贴板的内容包含符合迅雷下载地址格式的就弹出新建下载任务窗口。

可能我们也希望在自己的应用程序中也加入这样XX的功能,其实不难,真的,我用老顽童的人格保证,实现该功能是灰常简单的。

我们需要完成两步就行了。

1、调用AddClipboardFormatListener函数,指定哪个窗口有资格去捕捉剪贴板内容更新的消息。

2、处理WM_CLIPBOARDUPDATE消息,当剪贴板的内容发生变化后,消息处理程序会收到这条消息通知。

我相信,你一定想到了实现思路了。呵呵,我一向对于大家的领悟能力是很有信心的,所以,有时候我故意不说那么明白。其实我们学编程,不能什么问题都指望别人帮忙解决,依靠自己去解决问题才是上尚之道。

今天老邪不用C++来做这个例子,用什么?VB,呵呵,其实也可以,只是许多自负的人看不起VB,很可悲;Delphi?还是不要,不然老顽童会骂人。还是用C#,一来它的语法符合C风格,二来它也可以调用Win32 API。

估计有人会纳闷了,写Win32程序不是要用C++吗?干吗用C#?呵呵,很简单,因为我是老邪,本来俺练的盖世武功就是“旁门左道”,更何况,这年头,人是以非主流为无上光荣的。今天老邪也想“光荣”一回,免得蓉儿说我老了,功夫不行了。

而且,我咨询过相关律师,法律上并没有规定写Win32程序一定要用C++,再说,WinForm本质上也是Win32,而且人家WinForm还可以做Win64呢。

正因为今天的任务很简单,所以我忍不住拿出了看家本领——吹牛,是啊,吹牛好啊,人生难得几回吹。

在处理WM_CLIPBOARDUPDATE消息之前,一定要先调用AddClipboardFormatListener函数,它的原型如下:

  1. /*  c++  */
  2. BOOL WINAPI AddClipboardFormatListener(
  3. _In_  HWND hwnd
  4. );

参数有且只有一个,就是窗口的句柄,你想让哪个窗口监控剪贴板,你就把这个窗口的句柄传进去。

下面是DllImport

  1. // C#
  2. [DllImport("User32.dll")]
  3. public extern static bool AddClipboardFormatListener(IntPtr hwnd);

然后,在Form的构造函数中调用。

  1. public Form1()
  2. {
  3. InitializeComponent();
  4. AddClipboardFormatListener(this.Handle);
  5. }

接着,如何写消息处理过程呢?重写WndProc方法。

  1. protected override void WndProc(ref Message m)
  2. {
  3. if (m.Msg == WM_CLIPBOARDUPDATE)
  4. {
  5. if (Clipboard.ContainsText())
  6. {
  7. string strdata = Clipboard.GetText();
  8. if (strdata.StartsWith("http://") || strdata.StartsWith("https://"))
  9. {
  10. this.txtOutput.AppendText(string.Format("在{0}剪贴板发生了变化。\r\n" +
  11. "包含URI:{1}" +
  12. "\r\n---------------------------------------------\r\n",
  13. DateTime.Now.ToString("HH:mm:ss"),
  14. strdata));
  15. // 返回0表示已经处理消息
  16. m.Result = new IntPtr(0);
  17. }
  18. }
  19. }
  20. else
  21. {
  22. base.WndProc(ref m);
  23. }
  24. }

最后,可以测试,随便复制一些URI到剪贴板。如下图所示。

好了,大功告成,继续下电影去,拜拜。

跟我一起玩Win32开发(25):监视剪贴板的更多相关文章

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

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  2. 跟我一起玩Win32开发(17):启动和结束进程

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...

  3. 跟我一起玩Win32开发(18):使用对话框的两个技巧

    相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...

  4. 跟我一起玩Win32开发(19):浏览和打开文件

    在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...

  5. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  6. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  7. 跟我一起玩Win32开发(14):用对话框作为主窗口

    前面我们在编写Win32应用程序的思路都是: 1.设计窗口类.2.注册窗口类.3.创建窗口.…… 然而,当我们接触控件以后, 会发现一个问题,我们在窗口上放置控件实在不好弄,而资源中的对话框具有图形编 ...

  8. 跟我一起玩Win32开发(4):创建菜单

    也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...

  9. 跟我一起玩Win32开发(2):完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

随机推荐

  1. java接口的一些想法

    最近一直在闷头往前看<thingking in java> ,但是却由于赶了进度而忘记了初衷.当学到集合的时候,回头却发现,我连最基本的接口都不明白.查了一上午资料,现在明白例如一点点,写 ...

  2. 面向对象五大原则_1.单一职责原则&amp;2.里氏替换原则

    单一职责原则:Single Responsibility Principle (SRP) 一个类.仅仅有一个引起它变化的原因.应该仅仅有一个职责.每个职责都是变化的一个轴线.假设一个类有一个以上的职责 ...

  3. DRF框架

    1.RESTful规范 1.1 REST风格:表属性状态转移 1.1.1资源:在web中凡是有被引用的必要的都叫资源 1.1.2 URI:统一资源标识符    URI包含URL 1.1.3 URL:统 ...

  4. 逼近法(例 poj3208、poj1037)

    ​ 逼近法是一种很奇妙的算法,以为"逼近"这一种思想在很多的算法中都有体现.诸如:像我们的二分答案,不断地排除决策集合的一半以接近我们的最终答案:我们的树上倍增求 \(LCA\) ...

  5. android 中的常用组件

    gradle gradle 是个啥,一开始我也没弄清,官方解释是: Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具 那么Apache Ant和Apache ...

  6. vmware Ubuntu忘记登录密码

    VMware Workstation 上的Ubuntu 11.10 登录时,用户密码忘记了,以下是我对此问题解决的方法: 1)重新启动Ubtuntu 16 系统,同时长时间按住(或连续点击)esc键进 ...

  7. HDU 3714/UVA1476 Error Curves

    Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  8. HDU 5666 Segment

    Segment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. vue中引入字体文件

    在用vue来写一官网的时候,想引入外部字体文件,毕竟总感觉他自己的字体有点难看,在这里记录下 1.先下载字体文件所需的.ttf文件 我这里想引入的是华文行楷字体 百度后下载了一个3M多的ttf文件 2 ...

  10. bzoj5328: [Sdoi2018]物理实验

    果然我还是太菜了,爆了一天才过....隔壁肉丝都不知道喊了多少句哎╮(╯▽╰)╭我又A了什么傻逼题(然鹅就是wf和国集的题QWQ) 其实这个题就是个裸题,但是我就是不会... 这个题第一步就是明显的旋 ...