2010-02-19 12 views
9

Para una pequeña utilidad que estoy escribiendo (.NET, C#), deseo monitorear las operaciones de copia del portapapeles y las operaciones de pegado del portapapeles.¿Cómo obtener una notificación de pegado del portapapeles y proporcionar mis propios datos?

Mi idea es proporcionar mis propios datos al pegarlos en una aplicación arbitraria.

La supervisión de una operación de copia se puede hacer fácilmente utilizando un clipboard viewer.

Algo que parece mucho más avanzado para mí es escribir un "proveedor de pasta de portapapeles":

  • respuesta a "¿qué formatos están disponibles" consultas de aplicaciones.
  • Suministre datos a las operaciones de pegado de la aplicación.

Encontré this posting y this posting, pero ninguno de ellos parece realmente ayudarme.

Lo que supongo es que de alguna manera tengo que imitar/secuestrar el portapapeles actual.

Pregunta:

¿Es posible "envolver" el portapapeles en términos de operaciones de pegado y proporcionar mi propio tipo de "Proxy portapapeles"?

+1

PS: Yo sé que en CodeProject;) irónico que te redirecciona a CodeProject para este !! !! : D lol – t0mm13b

Respuesta

11

Debe enganchar el gancho del portapapeles mediante un gancho de Windows. Un gancho de Windows es una forma de interceptar eventos globales que suceden y de proporcionar su propio procedimiento de enlace para reemplazar o interceptar el mensaje. Eche un vistazo aquí en CodeProject que explica cómo enganchar. Aquí hay un clipboard helper que escucha la funcionalidad copiar/pegar. Aquí hay un Clipboard spy que simplemente hace eso. Aquí hay otro artículo que implementa un Clipboard hook.

+5

¡Gracias, Tom! La mejor referencia de artículo es la que engancha "Ctrl + V". Pero: ¿Qué ocurre si el usuario hace clic derecho y selecciona "Pegar" en un menú contextual o completa de otra forma? Supongo que la solución sería _no_ enganchar el teclado/mouse/lo que sea, sino interceptar la comunicación directa con el portapapeles. –

9

Mire en "representación retrasada" en el WinAPI. Con esta técnica, carga el portapapeles con controladores nulos y, al pegar, Windows le notifica con un mensaje WM_RENDERFORMAT. Así es como las aplicaciones como Excel pueden escaparse "copiando" 25 formatos diferentes. Realmente no los copia todos. En realidad producirá algunos comunes como TEXTO, pero "publicitará" los otros como Bitmap, Html, WKS, etc., optando por esperar para ver qué es lo que la aplicación objetivo desea pegar.
Considere esto: puede seleccionar 5000 celdas en Excel y copiar, y el portapapeles se actualiza bastante rápido. Ahora pegue en Windows Paint, y de repente su sistema se arrastra cuando Excel intenta renderizar un gran mapa de bits. Las versiones anteriores normalmente se bloquean, después de usar toda la memoria disponible y comer el archivo de paginación. Sin embargo, esto estaba de regreso en los días de Windows 3.1. Las versiones modernas dan un mensaje sobre "mapa de bits demasiado grande" o "memoria insuficiente". Advertencia: la presentación retrasada se activará prematuramente por las aplicaciones que supervisan el portapapeles y pegan automáticamente datos en ellos mismos, como Escritorio remoto, VMWare, Office Clipboard y mi propio ClipMate. Algunos programas de seguimiento portapapeles pueden ser invocados para ignorar la actualización portapapeles mediante el uso de la bandera CF_Clipboard_Viewer_Ignore, que he documentado aquí: link text

+0

Hombre ...... increíble .. –

Cuestiones relacionadas