欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现的Windows剪贴板监视器功能实例【附demo源码下载】

程序员文章站 2023-01-30 09:09:26
本文实例讲述了c#实现的windows剪贴板监视器功能。分享给大家供大家参考,具体如下: windows剪贴板 剪贴板(clipboard)是内存中的一块区域,是win...

本文实例讲述了c#实现的windows剪贴板监视器功能。分享给大家供大家参考,具体如下:

windows剪贴板

剪贴板(clipboard)是内存中的一块区域,是windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中不足的是,剪贴板只能保留一份数据,每当新的数据传入,旧的便会被覆盖。

相关windows api

最主要的是setclipboardviewer,每当剪贴板的内容发生变化时,该函数通过wm_drawclipboard消息将窗口加入被通知的窗口链。

由于剪贴板观察器链中下一个窗口的句柄还没有返回,应用程序不应传递它在setclipboardviewer

调用过程中接收到的wm_drawclipboard消息。

如果要从剪贴板观察器链中去掉窗口链,则应用程序必须调用changeclipboard成员函数。

#region definitions
//constants for api calls...
private const int wm_drawclipboard = 0x308;
private const int wm_changecbchain = 0x30d;
//handle for next clipboard viewer...
private intptr mnextclipboardviewerhwnd;
//api declarations...
[dllimport("user32.dll", charset = charset.auto)]
static public extern intptr setclipboardviewer(intptr hwndnewviewer);
[dllimport("user32.dll", charset = charset.auto)]
static public extern bool changeclipboardchain(intptr hwnd, intptr hwndnext);
[dllimport("user32.dll", charset = charset.auto)]
public static extern int sendmessage(intptr hwnd, int msg, int wparam, int lparam);
#endregion

wndproc函数

操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过getmessage等方法最终将消息提交到窗口过程(wndproc[英文全称windows process])指向一个应用程序定义的窗口过程的指针。

我们需要重写该函数来处理剪贴板内容改变事件:

#region message process
//override wndproc to get messages...
protected override void wndproc(ref message m)
{
  switch (m.msg)
  {
    case wm_drawclipboard:
      {
        //the clipboard has changed...
        //##########################################################################
        // process clipboard here :)........................
        //##########################################################################
        sendmessage(mnextclipboardviewerhwnd, m.msg, m.wparam.toint32(), m.lparam.toint32());
        //显示剪贴板中的文本信息
        if (clipboard.containstext())
        {
          label1.text = clipboard.gettext();
        }
        //显示剪贴板中的图片信息
        if (clipboard.containsimage())
        {
          picturebox1.image = clipboard.getimage();
          picturebox1.update();
        }
        break;
      }
    case wm_changecbchain:
      {
        //another clipboard viewer has removed itself...
        if (m.wparam == (intptr)mnextclipboardviewerhwnd)
        {
          mnextclipboardviewerhwnd = m.lparam;
        }
        else
        {
          sendmessage(mnextclipboardviewerhwnd, m.msg, m.wparam.toint32(), m.lparam.toint32());
        }
        break;
      }
  }
  base.wndproc(ref m);
}
#endregion

效果图:

C#实现的Windows剪贴板监视器功能实例【附demo源码下载】

完整实例代码点击此处本站下载

更多关于c#相关内容感兴趣的读者可查看本站专题:《c#字符串操作技巧总结》、《c#数组操作技巧总结》、《c#中xml文件操作技巧汇总》、《c#常见控件用法教程》、《c#程序设计之线程使用技巧总结》、《c#操作excel技巧总结》、《winform控件用法总结》、《c#数据结构与算法教程》及《c#面向对象程序设计入门教程

希望本文所述对大家c#程序设计有所帮助。