
Hace unos días tuve la necesidad de escribir una pequeña aplicación que monitoreara el portapapeles de Windows y, si el contenido era una imagen, escribiera automáticamente un archivo con extensión JPG con el contenido del portapapeles; parte del meollo del asunto fue monitorear el portapapeles de Windows, pero afortunadamente es bastante sencillo, y de eso trata este artículo. Antes de iniciar, un poco de antecedentes sobre como monitorear el portapapeles:
Monitoreando el portapapeles
En Windows hay tres métodos para monitorear el portapapeles:
- Crear un visor del portapapeles (cualquier versión de Windows)
- Obtener el número de secuencia del portapapeles (Windows 2000 y más recientes)
- Implementar un oyente (listener) de formato de portapapeles (Windows Vista y recientes)
Vamos a hablar de cada una de ellas e implementarlas todas para ver como funcionan.
Método 1: monitoreando el portapapeles con un visor del portapapeles
Un visor del portapapeles es básicamente una ventana que se ha registrado en una “cadena de visores del portapapeles” que será notificada cuando el contenido de este portapapeles cambie; en pocas palabras, la cadena de visores del portapapeles es una lista interna de Windows de aplicaciones que reciben una notificación cuando el contenido del portapapeles cambia. Implementar un visor es sencillo, y sólo hay que seguir los pasos:
- Añadir la ventana a la cadena de visores del portapapeles
- Procesar dos mensajes: WM_CHANGEBCHAIN y WM_DRAWCLIPBOARD
- Al finalizar la aplicación, removerla ventana de la cadena de visores del portapapeles
Empecemos pues con la implementación; para iniciar, crea un nuevo proyecto en Delphi, y añade un componente TImage, preferentemente alínealo al área de cliente; añade “Clipbrd” a tu “uses”. Es todo lo que necesitaremos.
Para el primer paso de la lista anterior necesitamos de la función SetClipboardViewer(), que es una función definida en Windows.pas y que necesita como parámetro el handle de la ventana que se registrará como visor del portapapeles; retorna el handle del próximo visor (recuerda, es una cadena de visores), mismo que debe de ser almacenado, pues nos servirá después para puentear los mensajes recibidos al resto de la cadena, así como para desconectarnos de la misma.
