Como monitorear el portapapeles (clipboard) de Windows con Delphi

Clipboard convencional de cartón

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:

  1. Crear un visor del portapapeles (cualquier versión de Windows)
  2. Obtener el número de secuencia del portapapeles (Windows 2000 y más recientes)
  3. 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:

  1. Añadir la ventana a la cadena de visores del portapapeles
  2. Procesar dos mensajes: WM_CHANGEBCHAIN y WM_DRAWCLIPBOARD
  3. 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.

Sigue leyendo

Publicado en Delphi | Deja un comentario

Cómo identificar la versión de Delphi en tiempo de compilación

En muchas ocasiones es extremadamente útil saber en que versión del compilador de Delphi estamos trabajando, en particular para los que desarrollan componentes, pues por lo general hay dependencias sobre ciertas versiones. Hay dos formas de identificar la versión de Delphi en tiempo de compilación: la primera de ellas es usando la directiva de compilador {$IFDEF} en conjunto con varios símbolos que se definen al compilar y que son los siguientes:

{$IFDEF VER80}  - Delphi 1
{$IFDEF VER90}  - Delphi 2
{$IFDEF VER100} - Delphi 3
{$IFDEF VER120} - Delphi 4
{$IFDEF VER130} - Delphi 5
{$IFDEF VER140} - Delphi 6
{$IFDEF VER150} - Delphi 7
{$IFDEF VER160} - Delphi 8
{$IFDEF VER170} - Delphi 2005
{$IFDEF VER180} - Delphi 2006
{$IFDEF VER180} - Delphi 2007
{$IFDEF VER185} - Delphi 2007
{$IFDEF VER200} - Delphi 2009
{$IFDEF VER210} - Delphi 2010
{$IFDEF VER220} - Delphi XE
{$IFDEF VER230} - Delphi XE2
{$IFDEF VER240} - Delphi XE3
{$IFDEF VER250} - Delphi XE4
{$IFDEF VER260} - Delphi XE5
{$IFDEF VER265} - AppMethod 1
{$IFDEF VER270} - Delphi XE6
{$IFDEF VER280} - Delphi XE7
{$IFDEF VER290} - Delphi XE8

Los de ojo agudo se percatarán que hay un par de símbolos que no siguen la secuencia, en particular VER180 y VER185, que indican Delphi 2006 y Delphi 2007, respectivamente; en su momento esto se hizo de esta forma para que con Delphi 2007 no se rompiera la compatibilidad con Delphi 2006, pero para aquellos que quisieran dependencia sobre Delphi 2007 entonces se usa VER185. Con estas constantes, el siguiente código:

{$IFDEF VER140}
ShowMessage('Vaya! su Delphi ya está entrado en años...');
{$ENDIF}
{$IFDEF VER200}
ShowMessage('Ups! cuidado con Unicode!');
{$ENDIF}

Cuando se compile y ejecute, mostraría el primer mensaje si fuera compilado bajo Delphi 6.0, y el segundo si fuera compilado con Delphi 2009. Sin embargo, a pesar de que los símbolos mencionados anteriormente son útiles, pueden ser engorrosos cuando se quieren hacer varias comparaciones, como por ejemplo saber si el compilador usado es superior a Delphi 6.0, es decir, que puede ser el 7, 8, 2006 o cualquiera superior. Para esas ocasiones, a partir de Delphi 6.0 existe una constante llamada CompilerVersion que define la versión usada de Delphi. Su uso es como sigue:

{$IF CompilerVersion >= 20}
{ El código que esté entre estas directivas sólo se compilará bajo Delphi 2009 }
{$IFEND}

Y como puedes ver, la comparación permite los operadores con los que estamos familiarizados, como “>=”. El listado de valores posibles de CompilerVersion es el siguiente:

Delphi XE8  - 29
Delphi XE7  - 28
Delphi XE6  - 27
AppMethod 1 - 26.5
Delphi XE5  - 26
Delphi XE4  - 25
Delphi XE3  - 24
Delphi XE2  - 23
Delphi 2010 - 21
Delphi 2009 - 20
Delphi 2007 - 18.5
Delphi 2006 - 18
Delphi 2005 - 17
Delphi 8    - 16
Delphi 7    - 15
Delphi 6    - 14

Como puedes ver, es muy sencillo identificar las versiones de Delphi.

Publicado en Delphi | Etiquetado , , | 1 comentario

Bienvenidos al laboratorio

Bloques de construcción

Hola a todos:

Bienvenidos a esta sección del blog Consultorio del Dr. Ogalinski, misma que servirá para escribir sobre una de mis pasiones, la ingeniería y desarrollo de software. Principalmente escribiré sobre Delphi, pero también sobre muchos otros lenguajes (excepto .NET, al menos por ahora 😀 ), modelos, técnicas y mucho más, todo relacionado con este tema tan interesante. Espero la pasen bien y les sirva de algo lo que vean por aquí.

Publicado en Sin categoría | Etiquetado , | 5 comentarios