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:
Dynamically 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!