PDA

Ver la Versión Completa : callback para drawtext textout


callbacking
26-07-2008, 01:48:07
Pues eso es, a ver si alguien sabe como implementar un callback para drawtext o textout, quiero atrapar los textos de windows antes de que sean escritos y cambiarlos, tanto del fondo como de las ventanas, como de los menus, control sobre todo lo que windows escribe antes de que lo escriba, tanto si tienen controles estandar como si no, yo no encuentro otra manera que estas funciones que deben ser de gdi32.dll creo. No le pido a nadie que se curre 300 lineas de programa(si lo hace pues :)). El problema es que he buscado y me parece que lo que quiero es tan específico que no encuentro nada, igual no empleo las palabras correctas. Otras funciones tienen en uno de sus parametros el puntero al procedimiento que se va a ejecutar, lo cambias y listo. Pero pej.:
WINAPI DrawTextW_I(
HDC hDC,
const WCHAR* lpString,
int nCount,
RECT* lpRect,
unsigned int uFormat
);
Pues no veo el puntero a la funcion callback. Ni tampoco por donde cogerlo, a ver si alguien...se tira al chicle y se saca unas lineas de código facilitas de leer que hagan este tingladete.
Ah!, en Delphi obviamente. Gracias de antemano por el interés.

Lepe
26-07-2008, 10:31:50
Tienes razón, no hay callback.

DrawText tiene como parámetro el hdc, que es el handle de la superficie donde se va a pintar( el TCanvas de delphi); en el parámetro lpRect está la porción de espacio donde se pintará.

No sé si aclaro algo, creo que no :(.

callbacking
26-07-2008, 11:15:20
No, pero gracias. No hay función callback. Pero hay forma de monitorizar todos los textos que windows escribe. Lo que necesito es atrapar todos los textos de esas ventanas antes de ser escritos. En algun sitio se guardan las coordenadas y los textos --- textout (contexto, coorx,coory,puntero al string, num caracteres) --- digo yo. Windows enviará esta información a textout o drawtext y la presentará en pantalla, yo quiero pillarlo antes de que llegue a textout, coordenadas y texto, hacer lo que yo quiera con ello y después que siga su camino a textout y lo presente en pantalla.

Al González
26-07-2008, 16:20:53
Échale una mirada a la función SetWindowsHookEx con las opciones wh_CallWndProc o wh_CallWndProcRet. A ver si te funciona con una rutina de retrollamada CallWndProc o CallWndRetProc, respectivamente.

seoane
26-07-2008, 16:44:31
Vamos por partes ¿que es lo que quieres conseguir? :confused:

Porque, aun interceptando todas las llamadas a la API DrawTextW, no podrás evitar que una aplicación utilice otra función diferente para mostrar texto, ya sea otra API, DirectX, etc ... o incluso una función propia que sea capaz de dibujar texto sin necesidad de ninguna librería externa.

Yo creo que lo mejor es que te centres en un objetivo mas pequeño, por eso te preguntaba al principio ¿realmente que quieres hacer?

De todos modos, si sigues queriendo interceptar todas las llamadas a una función de la API windows no te lo pondrá fácil, tendrás que recurrir a la inyección de código en todos los procesos que se ejecuten en el equipo. Busca información sobre "API hooking" y veras que no es algo sencillo, incluso puede que esas 300 lineas de las que hablabas al principio se queden cortas ;)

callbacking
26-07-2008, 22:31:29
sip, perdona, omití un detalle importante, tengo un hook global wh_cbt, en principio, puedo pillar todas las ventanas al crearse o activarse. Las que menos me interesan envian un mensaje EM_STREAMIN que si podría supongo capturar con wndproc(hwnd,msg,wparam,lparam), msg es de suponer que tendría el valor EM_STREAMIN. Las que me interesan de verdad(pero de la buena) son las que emplean drawtext y textout, y es ahi donde no veo ni por donde agarrarlo, supongo que cuando va a usar estas funciones se envie un
WM_PAINT a la ventana que se pueda pillar con wndproc, pero ni idea de por donde empezar. SIP temo que es lo que quiero, obtener las coordenadas y la cadena antes de que sea usada por drawtext o textout, de esa forma podré tanto modificar el texto como su posición en pantalla o alguna otra cosa.

callbacking
26-07-2008, 23:02:34
Drawtext y textout, el resto de las api, directx, ... no me interesan de momento, con eso voy servido para una temporada.:D

callbacking
27-07-2008, 01:40:23
ando por aqui, http://msdn.microsoft.com/en-us/library/ms534218(VS.85).aspx, con la ayuda de delphi y el sdk win32 que complementa la ayuda y buscando por internet pero na de na, no veo el por donde.

Al González; wndprocret no creo que me sirva parece que lo devuelve cuando ya ha sido procesado. Con wndproc podria pillar un wm_paint, pero ahi me quedo, ¿como se si es por un drawtext y lo que escribe?

callbacking
27-07-2008, 02:42:33
:) Mas claro lo tengo, todos los procesos que me interesa monitorizar usan gdi32.dll y la funcion TextOutW, sigo agradeciendo la atención, las ideas y los links de ayuda, veo que es jodido. También j..de desistir.