windows剪贴板剪贴板(clipboard)是内存中的一块区域,是windows内置的一个非常有用的工具,通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能。然而美中不足的是,剪贴板只能保留一份数据,每当新的数据传入,旧的便会被覆盖。
相关windows api最主要的是setclipboardviewer,每当剪贴板的内容发生变化时,该函数通过wm_drawclipboard消息将窗口加入被通知的窗口链。
由于剪贴板观察器链中下一个窗口的句柄还没有返回,应用程序不应传递它在setclipboardviewer
调用过程中接收到的wm_drawclipboard消息。
如果要从剪贴板观察器链中去掉窗口链,则应用程序必须调用changeclipboard成员函数。
#region definitions
//constants for api calls...
private const int wm_drawclipboard = 0x308;
private const int wm_changecbchain = 0x30d;
//handle for next clipboard viewer...
private intptr mnextclipboardviewerhwnd;
//api declarations...
[dllimport("user32.dll", charset = charset.auto)]
static public extern intptr setclipboardviewer(intptr hwndnewviewer);
[dllimport("user32.dll", charset = charset.auto)]
static public extern bool changeclipboardchain(intptr hwnd, intptr hwndnext);
[dllimport("user32.dll", charset = charset.auto)]
public static extern int sendmessage(intptr hwnd, int msg, int wparam, int lparam);
#endregion
wndproc函数操作系统向应用程序发送一系列消息,如左键按下和左键抬起,应用程序将通过getmessage等方法最终将消息提交到窗口过程(wndproc[英文全称windows process])指向一个应用程序定义的窗口过程的指针。
我们需要重写该函数来处理剪贴板内容改变事件:
#region message process
//override wndproc to get messages...
protected override void wndproc(ref message m)
{
switch (m.msg)
{
case wm_drawclipboard:
{
//the clipboard has changed...
//##########################################################################
// process clipboard here :)........................
//##########################################################################
sendmessage(mnextclipboardviewerhwnd, m.msg, m.wparam.toint32(), m.lparam.toint32());
//显示剪贴板中的文本信息
if (clipboard.containstext())
{
label1.text = clipboard.gettext();
}
//显示剪贴板中的图片信息
if (clipboard.containsimage())
{
picturebox1.image = clipboard.getimage();
picturebox1.update();
}
break;
}
case wm_changecbchain:
{
//another clipboard viewer has removed itself...
if (m.wparam == (intptr)mnextclipboardviewerhwnd)
{
mnextclipboardviewerhwnd = m.lparam;
}
else
{
sendmessage(mnextclipboardviewerhwnd, m.msg, m.wparam.toint32(), m.lparam.toint32());
}
break;
}
}
base.wndproc(ref m);
}
#endregion
效果:
以上就是c#实现windows剪贴板监视器的代码具体介绍的详细内容。