##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.hconst 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;elseSendMessage(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);elserichTextBox1.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】