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

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

可能我们也希望在自己的应用程序中也加入这样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. 通视频URL截取第一帧图片

    为了方便直接给UIImage加个类别,以后什么时候使用可以直接调用. #import <UIKit/UIKit.h> @interface UIImage (Video) /** 通过视频 ...

  2. HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA

    状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j]  ...

  3. HDOJ1002

    #include <iostream>#include<stdio.h> using namespace std;int main(){ int T, count_T; cha ...

  4. linux内核模块依赖图

    Module                  Size  Used by btrfs                 880032  0 raid6_pq               97812  ...

  5. DRF 之 版本控制

    1.版本控制是干什么用的,为什么要有版本? 我们都知道每一个程序都是有版本的.而且版本也会升级从v1升级到v2.v3.v4·····,但是我们不可能因为新版本出现旧版本就不去维护,因为用户有权选择不更 ...

  6. 使用双引擎,让kbmmw 的客户端访问更方便(既给浏览器做服务,也给桌面程序做服务)

    前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST  服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ...

  7. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别

    register_chrdev:Linux2.6.30之前所用,不用定义cdev:但 如果是register_chrdev 注册的话,这个时候,分配的次设备号,是从0~255,这样子的话,就分配的范围 ...

  8. HDU4289 Control —— 最小割、最大流 、拆点

    题目链接:https://vjudge.net/problem/HDU-4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  9. js split分割字符串成数组

    str = "2,2,3,5,6"; //这是一字符串 var strs = new Array(); //定义一数组 strs = str.split("," ...

  10. Runtime.getRuntime().addShutdownHook(Thread)

    Runtime.getRuntime().addShutdownHook(Thread)为虚拟机添加关闭时添加钩子线程