Cómo acceder a la variable a la que copia el sistema operativo

Una característica interesante que he visto en jDownloader software es cualquier enlace que copie en la ventana del navegador (es decir, Ctrl + c), los enlaces de contenido copiado aparecen automáticamente (es decir, sin que yo lo pegue) en su interfaz de usuario y comienza a descargar el contenido de los enlaces, si son válidos .

Me gustaría programar lo mismo, pero me desconcierta cómo acceder a la variable a la que copia el sistema operativo. Comparta sus ideas.

Gracias.

preguntado el 09 de enero de 11 a las 00:01

3 Respuestas

La respuesta de Adam Robinson está en el camino correcto, pero no es del todo correcto. Voy a intentar proporcionar la versión "larga" (en contraste con su versión "corta") y explicar en el camino dónde y por qué creo que la solución que propone no alcanza su objetivo final.

A este tenor, documentación explica que hay tres formas diferentes de monitorear los cambios en el portapapeles de Windows, cada una con sus propias advertencias:

  1. Crear una ventana del visor del portapapeles que se enganche en la cadena del visor del portapapeles y reciba mensajes de notificación cuando el usuario haya cambiado el contenido del portapapeles. (Disponible en todas las versiones de Windows, pero generalmente es más difícil de codificar y, por lo tanto, se desaconseja para aplicaciones más nuevas que no tienen una necesidad específica de sus funciones).

  2. Consultar el número de secuencia del portapapeles, que es un valor de 32 bits que cambia cada vez que se cambia el contenido del portapapeles. Su programa llama a la función API de Windows GetClipboardSequenceNumber una vez y almacena en caché su valor, luego, cada vez que desee verificar si el contenido del portapapeles ha cambiado, llame a esa misma función nuevamente y compare su valor de retorno con el valor que ha almacenado en caché. Aquí hay dos advertencias importantes:

    1. Esta función solo está disponible en Windows 2000 y versiones posteriores. No es probable que esto sea un problema si está escribiendo aplicaciones .NET, ya que las versiones de Framework desde la 3.0 dejaron de ser compatibles con W2K.

    2. Es no es un método de notificación, y no debe llamar a esta función repetidamente en un bucle de sondeo. Eso significa que tienes que a mano Llame a la función adecuada y compare el número de secuencia del portapapeles. No puede utilizar este método si desea "escuchar" y recibir una notificación inmediata cada vez que cambie el contenido del portapapeles, como describe en su pregunta. La documentación es muy explícita aquí:

      Este método es más adecuado para los programas que almacenan en caché los resultados en función del contenido actual del portapapeles y necesitan saber si los cálculos siguen siendo válidos antes de utilizar los resultados de esa caché. Tenga en cuenta que este no es un método de notificación y no debe utilizarse en un bucle de sondeo. Para recibir una notificación cuando cambie el contenido del portapapeles, utilice un detector de formato de portapapeles o un visor de portapapeles.

  3. Creación de un oyente de formato de portapapeles, que se registra para ser notificado cada vez que cambia el contenido del portapapeles. Esta es la solución ideal en su caso, porque evita las complejidades de crear una ventana del visor del portapapeles (opción 1), pero también le permite escuchar y recibir notificaciones cada vez que se cambia el contenido del portapapeles (a diferencia de la opción 2).

    El problema es que esto solo está disponible en Windows Vista y versiones posteriores. Si aún tiene la necesidad de apuntar a Windows XP (como la mayoría de nosotros lo hacemos), esta no es una opción para usted.


Por lo tanto, a partir del ejemplo que proporciona en la pregunta, me parece que la única opción disponible para usted es la opción 1, crear una ventana de visualización del portapapeles. La documentación entra en los detalles sangrientos de cómo configurar esto usando el SetClipboardViewer función y escuchando el WM_DRAWCLIPBOARD y WM_CHANGECBCHAIN mensajes. Hacer que esto funcione correctamente puede ser una tarea difícil de hacer por su cuenta, pero afortunadamente para nosotros, los desarrolladores de .NET, otros ya han hecho el trabajo duro por nosotros. ("Otros", digo, a pesar de tener esto uno de esos otros yo mismo.)

Este artículo en CodeProject es un buen ejemplo. Implementa tres tipos diferentes de ganchos: un gancho para ratón, un gancho para teclado y un gancho para portapapeles. Lo único que le interesa es el gancho del portapapeles, pero puede agregar una referencia a la DLL en su proyecto para comenzar a usar su funcionalidad de inmediato.

Si está interesado en los aspectos internos de cómo funciona esto y quiere intentar codificarlo usted mismo, este artículo parece ser una descripción fantástica de los pasos específicos involucrados.

contestado el 23 de mayo de 17 a las 13:05

Utiliza el My.Computer.Clipboard.GetText() función

También vea el msdn página

Respondido el 09 de enero de 11 a las 03:01

Pero, ¿cómo puedo saber si el usuario copia algo en la aplicación en ejecución? - Mahesh

Para poder llamar a esa función, al principio debería saber que el SO genera un evento de copia (es decir, haga clic con el botón derecho y copie). Pero, ¿cómo saber que se genera, a la aplicación en ejecución actual? - Mahesh

Más info: este enlace de MSDN con respecto al portapapeles. En particular, el ancla de este enlace debería llevarlo a la sección del documento sobre cómo monitorear el contenido del portapapeles.

La versión corta es que puede monitorear ya sea sondeando el número de secuencia y verificando si ha cambiado, o puede registrarse para escuchar cambios para formatos de contenido específicos del portapapeles. Tenga en cuenta que este último solo está disponible en Vista y versiones posteriores, por lo que, dependiendo de la plataforma de destino, es posible que deba ceñirse al sondeo.

Para utilizar estas funciones, deberá declarar una P / Invoke a la función no administrada. Aquí esta la Página de PInvoke.net en la función GetClipboardSequenceNumber, aunque la declaración aquí es C #, no VB.NET. La sintaxis de VB.NET debemos ser (no tengo VS frente a mí para verificar):

<DllImport("user32.dll")>
Public Shared Function GetClipboardSequenceNumber() as UInt32
End Function

Respondido el 09 de enero de 11 a las 04:01

Estoy de acuerdo con la mayoría de lo que sugiere, pero como usted mismo dice: "Tenga en cuenta que este último solo está disponible en Vista y versiones posteriores, por lo que, dependiendo de la plataforma de destino, es posible que deba ceñirse a las encuestas". Si el autor de la pregunta tiene la necesidad de ejecutarse en versiones anteriores de Windows y, por lo tanto, necesita "seguir con el sondeo", el GetClipboardSequenceNumber la función no es una opción. Vas a tener que hacerlo a la manera de la vieja escuela con engancharte a la cadena del visor del portapapeles. Describo esto más a fondo en mi respuesta. - Cody Grey ♦

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.