以下代码经测试没有问题 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication19 { public partial class Form1 : Form { [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SetClipboardViewer(IntPtr hWnd); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain( IntPtr hWndRemove, //handle to window to remove IntPtr hWndNewNext //handle to next window ); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); private IntPtr ClipboardViewerNext; /// <summary> /// Add this control to the Clipboard chain to receive notification events| /// </summary> private void RegisterClipboardViewer() { ClipboardViewerNext = SetClipboardViewer(this.Handle); } /// <summary> /// Remove this form from the Clipboard Viewer list /// </summary> private void UnregisterClipboardViewer() { ChangeClipboardChain(this.Handle, ClipboardViewerNext); } public Form1() { InitializeComponent(); RegisterClipboardViewer(); } /// <summary> /// Process window messages /// <res> /// This code was not entirely written by me but has been modified from /// compiled from examples /// found while researching the subject! /// </res> /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { const int WM_DRAWCLIPBOARD = 0x308; const int WM_CHANGECBCHAIN = 0x030D; switch (m.Msg) { case WM_DRAWCLIPBOARD: MessageBox.Show(System.Windows.Forms.Clipboard.GetText()); SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam); break; case WM_CHANGECBCHAIN: if (m.WParam == ClipboardViewerNext) ClipboardViewerNext = m.LParam; else SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam); break; default: base.WndProc(ref m); break; } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { UnregisterClipboardViewer(); } } }
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication19
{
public partial class Form1 : Form
{
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern
IntPtr SetClipboardViewer(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern
bool ChangeClipboardChain(
IntPtr hWndRemove,
//handle to window to remove
IntPtr hWndNewNext
//handle to next window
);
[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
private IntPtr ClipboardViewerNext; /// <summary>
/// Add this control to the Clipboard chain to receive notification events|
/// </summary>
private void RegisterClipboardViewer()
{
ClipboardViewerNext = SetClipboardViewer(this.Handle);
}
/// <summary>
/// Remove this form from the Clipboard Viewer list
/// </summary>
private void UnregisterClipboardViewer()
{
ChangeClipboardChain(this.Handle, ClipboardViewerNext);
}
public Form1()
{
InitializeComponent();
RegisterClipboardViewer();
}
/// <summary>
/// Process window messages
/// <res>
/// This code was not entirely written by me but has been modified from
/// compiled from examples
/// found while researching the subject!
/// </res>
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
MessageBox.Show(System.Windows.Forms.Clipboard.GetText());
SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == ClipboardViewerNext)
ClipboardViewerNext = m.LParam;
else
SendMessage(ClipboardViewerNext, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
} private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
UnregisterClipboardViewer();
}
}
}
我设置了//this.ShowInTaskbar = false;
这样好像就不行了