Hola, es mi primera vez escribiendo en un foro, saludos a todos y gracias de antemano.
La pregunta es : Como guardar la seleccion del mouse en otra aplicacion en una variable dentro de mi programa.
Ej: Selecciono un parrafo dentro de un navegador por ejemplo de wikipedia, esa seleccion (Osea cuando pintamos con el mouse) quiero guardarla en una variable para luego usarla.
El programa lo estoy desarrollando en c# con Visual Studio 2015 y estoy usando un formulario WPF.
Gracias y perdonen la molestia.
Hola.
Las preguntas sobre C# van en el subforo de programación .NET.
Para lo que pides hacer se requiere mucho tiempo y dedicación implementando mucho P/invoking; mediante las funciones Win32
SetWindowsHookEx,
CallNextHookEx y
UnhookWindowsHookEx puedes crear un hook de bajo nivel del mouse para capturar una pulsación del botón izquierdo (mensaje de ventana
WM_LButtonDown), posteriormente puedes utilizar la función
GetCursorPos para obtener las coordenadas del puntero del mouse, pasándole esas coordenadas a la función
WindowFromPoint para obtener el handle de la ventana del control de edición donde se haya pulsado el botón izquierdo del ratón, entonces esperarías al mensaje de ventana
WM_LButtonUp para determinar cuando ha finalizado la selección del mouse y acto seguido utilizarías la función
SendMessage para enviar el mensaje de ventana
WM_Copy a la ventana del control de edición con el que copiarías el texto seleccionado al portapapeles de Windows... y ya con la función administrada
Clipboard.GetText() de la librería de clases de .NET framework obtendrías el texto
Eso sería una de las posibles formas de llevarlo a cabo. Otra forma, la cual evitaría la implementación de la mayor parte del P/Invoking (excepto el hook) sería mediante el uso de las clases de Microsoft UI Automation de la librería de clases de .NET Framework, lo cual como ventaja tendría una implementación administrada, mucho más sencilla, y eficiente, pero como desventaja resultaría excesivamente lento para esta tarea y aportaría menor compatibilidad con cierto tipos de aplicaciones y jerarquía de ventanas.
Nótese que he omitido algunos pasos importantes pero irrelevantes para un resumen, como por ejemplo las comprobaciones de ventana... que no sean nulos, comprobar que entre el mensaje de ventana
WM_LButtonDown y
WM_LButtonUp se haya realizado una selección y que esa selección sea de tipo textual (es decir, que contenga texto), y comprobar si existe algún texto u otro elemento guardado en el portapapales antes de reemplazarlo por nuestro texto seleccionado, y en caso afirmativo restaurar el elemento original del portapapeles al finalizar la operación.
Aquí tienes un proyecto en C# que podrías adaptar a tus necesidades:
- https://github.com/DynamicTranslator/DynamicTranslator
CitarDynamically catches selected texts where any window you on(pdf/browser/word etc.) and translates including words.
(no lo he probado)
Nótese que el autor hace uso de la función Win32
SetClipboardViewer la cual está obsoleta (solo existe por compatibilidad), en su lugar se debería utilizar
GetClipboardSequenceNumber y
AddClipboardFormatListener.
¡Saludos!