<2017年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

跟我一起玩Win32开发(25):监视剪贴板

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

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

 

可能我们也希望在自己的应用程序中也加入这样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函数,它的原型如下:

[cpp] view plain copy
 
  1. /*  c++  */  
  2. BOOL WINAPI AddClipboardFormatListener(  
  3.   _In_  HWND hwnd  
  4. );  

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

 

下面是DllImport

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

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

[csharp] view plain copy
 
  1. public Form1()  
  2. {  
  3.     InitializeComponent();  
  4.     AddClipboardFormatListener(this.Handle);  
  5. }  

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

[csharp] view plain copy
 
  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到剪贴板。如下图所示。



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

posted @ 2018-03-31 14:01  史D芬周  阅读(450)  评论(0编辑  收藏  举报