这都是winforms应用程序的直接内容
笔记
:您无法从控制台应用程序轻松完成此操作
声明此
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
在窗体构造函数中
// this.handle is your forms handle
_ClipboardViewerNext = SetClipboardViewer(this.Handle);
然后您将收到
WM_DRAWCLIPBOARD
通过重写WndProc在表单中显示消息
以您的形式
protected override void WndProc(ref Message m)
{
switch ((Win32.Msgs)m.Msg)
{
case Win32.Msgs.WM_DRAWCLIPBOARD:
// Handle clipboard changed
break;
// ...
}
// we call this so we to pass the message along
base.WndProc(ref m);
}
另一种方法,也许是更现代的方法
声明此
public const int WM_CLIPBOARDUPDATE = 0x031D;
public static IntPtr HWND_MESSAGE = new IntPtr(-3);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AddClipboardFormatListener(IntPtr hwnd);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
在窗体构造函数中
SetParent(Handle, HWND_MESSAGE);
AddClipboardFormatListener(Handle);
以您的形式
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLIPBOARDUPDATE)
{
// handle message
}
base.WndProc(ref m);
}
如果您使用的是类库,则必须创建一个隐藏对象并传回一个操作或事件
private class HiddenForm : Form
{
public HiddenForm()
{
SetParent(Handle, HWND_MESSAGE);
AddClipboardFormatListener(Handle);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLIPBOARDUPDATE)
{
// do stuff here like call event
}
base.WndProc(ref m);
}
}
笔记
:这些都没有经过测试,但应该可以让您开始
更新1
SetClipboardViewer
需要窗口句柄,而不是进程句柄。如果
如果没有窗口句柄,请为
接收剪贴板消息的唯一目的-感谢
II不可检测
更新2
这将只适用于也始终具有
可用的完整框架。-幸亏
汉斯·帕桑特