PDA

Ver la Versión Completa : Pasar palabra bajo cursor en un programa a aplicación Delphi


Q37
01-01-2007, 15:59:10
Antes que nada ¡Feliz Año! :)

Estoy haciendo una aplicación que debe funcionar parecido al Babylon/Ifinger u otro programa tipo diccionario. Es decir, tras pulsar una combinación de teclas, debe pasar la palabra en la que se encuentra posicionado el cursor (en la aplicación que sea - Word, Outlook,etc) a mi programa, donde se buscará si la palabra existe en la base de datos y mostrará los campos pertinentes.

Tengo controlado el tema de capturar la combinación de teclas desde otro programa y pasar el foco a mi aplicación, pero el pasar la palabra bajo el cursor me parece un poco, bastante, superhipermega dificil que t k...

Alguna ayudita por caridad? :o

Q37
07-01-2007, 16:02:53
He resuelto el problema pero no al 100%

Consigo, una vez seleccionada una palabra, mediante
SendMessage( hVentana, WM_COPY, 0, 0 );
pasarla al portapapeles si lo contenido en ventana NO está en HTML. Es decir, funciona con WORD, NOTEPAD, etc pero no con IE, Thunderbird, etc (esta es la explicación que he leido).

Estoy intentando enviar eventos de teclado para simular Ctrl+C pero no funciona. He probado:

keybd_event($11,0,0,0);
keybd_event($43,0,0,0);
keybd_event($43,0,KEYEVENTF_KEYUP,0);
keybd_event($11,0,KEYEVENTF_KEYUP,0);

y

PostMessage( hVentana,wm_KeyDown,Ord(11),0);
PostMessage( hVentana,wm_KeyDown,Ord(43),0);
PostMessage( hVentana,wm_KeyUp,Ord(43),0);
PostMessage( hVentana,wm_KeyUp,Ord(11),0);

¿Qué estoy haciendo mal?

¿Teneis alguna idea de cómo pasar lo selecionado en otra ventana al portapapeles?

Gracias por adelantado.

rivers
09-01-2007, 22:49:22
Amigo prueba esto haber si es lo que quieres:

keybd_event(VK_CONTROL,0,0,0); // CTRL presionado
keybd_event(VkKeyScan('V'),0,0,0); // V presionada
keybd_event(VkKeyScan('V'),0,2,0); // V presionada
keybd_event(VK_CONTROL,0,2,0); // Soltar CTRL.

Saludos,
Pedro.

Q37
11-01-2007, 21:59:16
No funciona y el caso es que la respuesta que me has dado es la que ponen en casi todos los foros.

Seguiré investigando y mientras tanto seguiré con la "chapucilla" de que sólo funcione en Word, Notepad, etc. usando

SendMessage( hFocusWin, WM_COPY, 0, 0 );


De todas formas gracias por tu respuesta.

ArdiIIa
11-01-2007, 22:35:17
Estoy haciendo una aplicación que debe funcionar parecido al Babylon/Ifinger u otro programa tipo diccionario.

Hola:
No se si los tiros van por ahí, pero por si acaso, te hago una reflexión:

¿Alguna vez te has planteado el porqué de muchos sitios, a la hora de registrarse exigen introducir un código generado en una imagen casi ilegible?

Pues las respuesta sería algo así como para evitar que los "robots" se registren automáticamente, o evitar el spam... etc...

A la vista de lo dicho, tal vez sería oportuno plantearse tu aplicación a modo de OCR (Reconocimiento óptico de caracteres); coger la palabra que está justamente bajo el cursor y "reconocerla". Aunque esto se plantea una tarea difícil, creo que justamente Babylon (el traductor), trabajaba así. De este modo, el programa sería muy eficaz a la hora de obtener dicha palabra.

De otro modo; trabajar con ventanas, obtener el texto de la ventana, y dilucidar justamente cual es la palabra que está bajo el cursor, también se me antoja una compleja tarea. Concretamente para los documentos HTML, date cuenta que no es texto puro, sino etiquetas por doquier y se puede complicar mas si esos documentos HTML están protegidos contra el "copiar/pegar".
Imagínate como podrías obtener un texto de un archivo PDF protegido. Obviamente con el "copiar/pegar" sería imposible, por eso te comentaba lo del OCR.


En fín, ya irás comentando tus progresos.

rivers
12-01-2007, 09:54:00
Amigo prueba esto haber si es lo que quieres:

keybd_event(VK_CONTROL,0,0,0); // CTRL presionado
keybd_event(VkKeyScan('V'),0,0,0); // V presionada
keybd_event(VkKeyScan('V'),0,2,0); // V presionada
keybd_event(VK_CONTROL,0,2,0); // Soltar CTRL.

Saludos,
Pedro.

Has probado de poner un sleep(100) antes de este proceso?, ya que a veces no hay suficiente tiempo para la aplicación.
Ah!! por cierto en vez de VkKeyScan('V') debes poner 'C' para el Copy y previamente seleccionar el texto.

Saludos.

Q37
13-01-2007, 13:05:51
Respondo a la vez a Rivers y a Ardilla.

Si he probado a poner Sleep(n) despues de cada keybd_event pero tampoco funciona.

Respecto a lo de afrontarlo en plan OCR ni se me habia ocurrido, en primer lugar porque en el tema del API de Windows, tal y como decía un profe que tuve, "estoy en condiciones óptimas para aprender" :p

Crei que simular un Doble Clik y luego Ctrl+C sería lo más asequible para mis conocimientos pero, aunque sigo creyendo que TIENE QUE HABER UNA FORMA DE CONSEGUIRLO, quizas explorar cómo hacerlo en plan OCR sea la solución.

Por cierto Ardilla, alguna idea para comenzar a andar?

Gracias chavales por vuestras respuestas. Seguireis leyendo mis lloros/progresos.

ArdiIIa
13-01-2007, 14:36:06
Bueno pues con relación a lo de enviar una secuencia al teclado a la ventana deseada, esto si te debería funcionar:

procedure xxxx(Sender: TObject);
Var
KeyState : TKeyboardState ;
begin
GetKeyboardState(KeyState);
KeyState[vk_CONTROL] := $81;
SetKeyboardState(KeyState);
PostMessage(hVentana,WM_KEYDOWN,VK_V,1);
PostMessage(hVentana,WM_KEYUP, VK_V,1);
KeyState[vk_CONTROL] := 0;
SetKeyboardState(KeyState);
End;


En este caso, se envia un CTRL-V

Con relación al tema OCR, vi hace algún tiempo algunos de los proyectos de SourceForge, y aunque muchos de ellos tienen buena pinta, no llegué a ver que ninguno funcionara. No obstante el código está allí.
Aunque sería estupendo abrir un hilo tal como se ha hecho con muchos otros temas (por ejemplo, un proyecto de facturación), para ver la evolución de un OCR realizado en Delphi.