c# - una - historial de portapapeles
¿Cómo controlo el contenido del portapapeles cambia en C#? (4)
Esta pregunta ya tiene una respuesta aquí:
- Evento del portapapeles C # 7 respuestas
Quiero tener esta característica en mi programa C #: cuando el usuario hace Ctrl + C o Copia en cualquier lugar (es decir, cuando cambia el contenido del portapapeles), mi programa recibirá una notificación y verificará si el contenido cumple con ciertos criterios, de ser así, conviértase en programa activo, y procesar el contenido, etc.
Puedo obtener los contenidos de System.Windows.Forms.Clipboard
, sin embargo, no sé cómo supervisar los cambios de contenido desde el portapapeles.
Si usa Windows Vista o posterior, use AddClipboardFormatListener
como en la respuesta de John Knoeller, para Windows XP, tengo que usar la API SetClipboardViewer
más antigua y más frágil, como en la respuesta aceptada.
La API de Win32 contiene una función SetClipboardViewer.
Puede hacer esto con pinvoke en la API de Win32 AddClipboardFormatListener
El oyente es un identificador de ventana (Form.Handle) y se notificarán los cambios al WM_CLIPBOARDUPDATE con una notificación WM_CLIPBOARDUPDATE
Es un reemplazo más robusto para la API más antigua de SetClipboardViewer
.
Puede usar SetClipboardViewer provisto por win32 API (a través de p / invoke).
Aquí hay una página que contiene el código para configurar uno en C #: http://www.codeguru.com/csharp/.net/net_general/tipstricks/article.php/c7315/
Escribí una pequeña clase de utilidad que usa la función de función AddClipboardFormatListener con una ventana de Message-only para hacer esto.
/// <summary>
/// Provides notifications when the contents of the clipboard is updated.
/// </summary>
public sealed class ClipboardNotification
{
/// <summary>
/// Occurs when the contents of the clipboard is updated.
/// </summary>
public static event EventHandler ClipboardUpdate;
private static NotificationForm _form = new NotificationForm();
/// <summary>
/// Raises the <see cref="ClipboardUpdate"/> event.
/// </summary>
/// <param name="e">Event arguments for the event.</param>
private static void OnClipboardUpdate(EventArgs e)
{
var handler = ClipboardUpdate;
if (handler != null)
{
handler(null, e);
}
}
/// <summary>
/// Hidden form to recieve the WM_CLIPBOARDUPDATE message.
/// </summary>
private class NotificationForm : Form
{
public NotificationForm()
{
NativeMethods.SetParent(Handle, NativeMethods.HWND_MESSAGE);
NativeMethods.AddClipboardFormatListener(Handle);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == NativeMethods.WM_CLIPBOARDUPDATE)
{
OnClipboardUpdate(null);
}
base.WndProc(ref m);
}
}
}
internal static class NativeMethods
{
// See http://msdn.microsoft.com/en-us/library/ms649021%28v=vs.85%29.aspx
public const int WM_CLIPBOARDUPDATE = 0x031D;
public static IntPtr HWND_MESSAGE = new IntPtr(-3);
// See http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AddClipboardFormatListener(IntPtr hwnd);
// See http://msdn.microsoft.com/en-us/library/ms633541%28v=vs.85%29.aspx
// See http://msdn.microsoft.com/en-us/library/ms649033%28VS.85%29.aspx
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
}
Esta clase asume que las notificaciones siempre son necesarias durante la vida útil de las aplicaciones, sin embargo, se podría modificar para proporcionar la posibilidad de anular la suscripción a través de la función RemoveClipboardFormatListener si es necesario.