关于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
- 关于C#监视剪贴板信息
- 用 C# 监视剪贴板的活动状态
- 在C#中监视剪贴板的变化
- C#从剪贴板获得信息
- 监视剪贴板内容
- 监视剪贴板内容
- 剪贴板监视保存器
- Java监视系统剪贴板
- 示例:WPF监视剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- C#复制、粘贴文本信息到剪贴板
- 如何监视系统剪贴板变化?
- VS中C#复制、粘贴文本信息到剪贴板
- hashcode和equals方法的联系
- QQ用户分组状态栏功能实现
- 《机器学习实战》读书笔记6:朴素贝叶斯源码
- Spring框架的理解
- SPOJ STC02 Antisymmetry——马拉车啊马拉车
- 关于C#监视剪贴板信息
- 新建了自己的博客,记录自己的学习、生活
- 皇后问题
- 25.软件磁盘阵列(Software RAID)
- 【HDU3555】Bomb-数位DP入门题
- Caffe windows 用自己的数据训练模型
- LeetCode_evaluate-reverse-polish-notation
- 理解基本基本类型和引用类型的值
- libcef的各种封装和用途汇总 & 离屏渲染offscreen渲染html5css3技术