首页 > 编程语言 >关于C#监视剪贴板信息

关于C#监视剪贴板信息

时间:2022-11-20 21:09:09浏览次数:46  
标签:剪贴板 iData C# nextClipboardViewer int DataFormats 监视 public


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

标签:剪贴板,iData,C#,nextClipboardViewer,int,DataFormats,监视,public
From: https://blog.51cto.com/yuzhyn/5872016

相关文章

  • C#标记废弃方法
    一、普通用法在C#中,如果一个方法我们不再使用,我们可以将其标记为“废弃”的方法,只需要在方法前,加一个[Obsolete]即可;[Obsolete]publicvoidBiuBiuBiu(){//嘿嘿嘿}废弃......
  • C# Winform 窗体美化(五、鼠标穿透)
    五、鼠标穿透以前在玩射击游戏的时候,狙击枪的设定一般是开镜才有准星,所以想是不是可以自己造一个默认准星出来,思路是现在窗口上画一个准星,然后把窗体其他区域都透明,然后设置......
  • C#操作Cookie
    简单的存储Cookie和获取Cookie例子publicstringSaveCookie(stringname){//登陆成功要将必要数据存储到Cookie里HttpCookiehttpCookie=newHttpCookie("coo......
  • C#日期格式
    关于C#中日期DateTime的格式转换代码如下:PS:请忽略Log.v();这个是自定义的日志方法……DateTimedt=DateTime.Now;Log.v(dt.ToString("D"));//2017年1月23日Log.v(dt.To......
  • C#单例模式的简单使用
    单例模式示例:publicsealedclassWindowService{//定义一个私有的静态全局变量来保存该类的唯一实例privatestaticWindowServiceService;//定义一个只读静......
  • C# 读取照片的EXIF信息
    一、使用MetadataExtractor读取EXIF信息1、NuGet中安装在NuGet中搜索并安装MetadataExtractor;2、包信息我安装后会有两个包:MetadataExtractor2.0.0和XmpCore5.1......
  • RV-LINK:Eclipse 使用 RV-LINK 调试 RISC-V 程序
    RV-LINK项目主页:​​https://gitee.com/zoomdy/RV-LINK​​​最新的文档请访问:​​https://gitee.com/zoomdy/RV-LINK/wikis​​,这里的内容可能没有及时更新。前期准备按......
  • RV-LINK:将 Longan Nano 开发板变成 RISC-V 仿真器
    实物图右边红色小板子是作为仿真器的LonganNano,左边蓝色大板子是GD32VF103V-EVAL开发板。下载GD32MCUDfuTool到这里​​http://gd32mcu.21ic.com/documents/index/......
  • RV-LINK:将 GD32VF103C-START 开发板变成 RISCV-V 仿真器
    实物图左边是作为仿真器的GD32VF103C-START,右边是GD32VF103V-EVAL开发板。下载GD32MCUDfuTool到这里​​http://gd32mcu.21ic.com/documents/index/classify_id/7​......
  • Windows server 2016 安装oracle的教程图解
    这篇文章主要介绍了Windowsserver2016安装oracle的教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1.安装oracleOracle的......