关于C#监视剪贴板信息

来源:互联网 发布:java分页原理 编辑:程序博客网 时间:2024/05/21 10:04

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是方案二)
下载

0 0
原创粉丝点击