关于C#监视剪贴板信息

##1、常规方法
在C#中,有一个常规检测剪贴板的方法,用的是 System.Windows.Forms.Clipboard;

使用起来很简单,代码如下:

/// <summary>
/// 设置剪贴板的文本内容
/// </summary>
/// <param name="s">文本内容</param>
public static void SetText(string s)
{
        Clipboard.SetDataObject(s ?? "");
}

/// <summary>
/// 获取剪贴板中的文本内容
/// </summary>
/// <returns>返回剪贴板文本</returns>
public static string GetText()
{
        IDataObject iData = Clipboard.GetDataObject();
        return (string)iData.GetData(DataFormats.Text);
}

/// <summary>
/// 获取剪贴板位图格式数据(比如从画图软件里复制的图片……)
/// </summary>
/// <returns>位图</returns>
public static Bitmap GetBitmap()
{
        IDataObject iData = Clipboard.GetDataObject();
        //确定此实例中存储的数据是否与指定的格式关联,或是否可以转换成指定的格式
        if (iData.GetDataPresent(DataFormats.Bitmap))
        {
                Bitmap bt = (Bitmap)iData.GetData(DataFormats.Bitmap);
                return bt;
        }
        return null;
}

##2、通知检测剪贴板
常规方法没有通知来告诉我们有数据,所以再来一个带通知的方案:

这个代码比较长……

public partial class Form2 : Form
{
    IntPtr nextClipboardViewer;
    public Form2()
    {
        InitializeComponent();
        nextClipboardViewer = (IntPtr)SetClipboardViewer((int)Handle);
    }

    /// <summary>
    /// 要处理的 WindowsSystem.Windows.Forms.Message。
    /// </summary>
    /// <param name="m"></param>
    protected override void WndProc(ref 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;
        }
    }
    /// <summary>
    /// 显示剪贴板内容
    /// </summary>
    public 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());
        }
    }

    /// <summary>
    /// 关闭程序,从观察链移除
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        ChangeClipboardChain(Handle, nextClipboardViewer);
    }

    #region WindowsAPI
    /// <summary>
    /// 将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口
    /// </summary>
    /// <param name="hWndNewViewer">句柄</param>
    /// <returns>返回剪贴板观察器链中下一个窗口的句柄</returns>
    [DllImport("User32.dll")]
    protected static extern int SetClipboardViewer(int hWndNewViewer);

    /// <summary>
    /// 从剪贴板链中移出的窗口句柄
    /// </summary>
    /// <param name="hWndRemove">从剪贴板链中移出的窗口句柄</param>
    /// <param name="hWndNewNext">hWndRemove的下一个在剪贴板链中的窗口句柄</param>
    /// <returns>如果成功,非零;否则为0。</returns>
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

    /// <summary>
    /// 将指定的消息发送到一个或多个窗口
    /// </summary>
    /// <param name="hwnd">其窗口程序将接收消息的窗口的句柄</param>
    /// <param name="wMsg">指定被发送的消息</param>
    /// <param name="wParam">指定附加的消息特定信息</param>
    /// <param name="lParam">指定附加的消息特定信息</param>
    /// <returns>消息处理的结果</returns>
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
    #endregion
}

认真看一下并不难理解,这种带通知的方式更方便操作。

##3、代码
另外代码打了个包(Form1是方案一,Form2是方案二)
下载

如果没有积分,可以关注公众号拿下载地址【大鱼code】
大鱼code

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于大大大洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值