2009-05-02 15 views
6

Quiero mejorar una aplicación, pero no hay 3: e party API disponible. Así que, básicamente, la idea es dibujar gráficos/texto en la parte superior de las ventanas de las aplicaciones.Cómo dibujar gráficos/texto encima de otra aplicación

Existen problemas con el orden z, los clipping y los clics del mouse dirigidos a mi aplicación o a la otra aplicación.

¿Qué es una forma elegante de hacer esto?

Imagen de ejemplo aquí. Es una aplicación comercial donde mi aplicación desea agregar información adicional en las ventanas de la aplicación comercial. [URL = http://img104.imageshack.us/my.php?image=windowontop.png][/URL]

+0

¿Puede ser más específico en cuanto a lo que quiere hacer? No hay una manera elegante de poner texto en la ventana de otra aplicación y conseguir que permanezca allí, solo maneras feas. Pero es posible que pueda lograr lo que desee de otra manera, dependiendo de su situación específica. –

+0

imagen agregada para demostrar lo que quiero hacer – s5804

Respuesta

7

No hay maneras agradables para hacer esto, pero uno de los enfoques que pueden funcionar para usted es para conectar la aplicación en cuestión usando SetWindowsHookEx (...) para añadir un GetMsgProc, que se basa en la superposición respuesta a los mensajes WM_PAINT. La idea básica es que estés dibujando TUS gráficos justo después de que la aplicación termine su propio dibujo.

En su aplicación principal:

.... 
HMODULE hDllInstance = LoadLibrary("myFavoriteDll"); 
HOOKPROC pOverlayHook = (HOOKPROC)GetProcAddress(hDllInstance, "OverlayHook"); 
SetWindowsHookEx(WH_GETMESSAGE, pOverlayHook, hDllInstance, threadId); 

apagado en una DLL en alguna parte:

LRESULT CALLBACK OverlayHook(int code, WPARAM wParam, LPARAM lParam) 
{ 
    //Try and be the LAST responder to WM_PAINT messages; 
    //Of course, if some other application tries this all bets are off 
    LRESULT retCode = CallNextHookEx(NULL, code, wParam, lParam); 

    //Per GetMsgProc documentation, don't do anything fancy 
    if(code < 0) return retCode; 

    //Assumes that target application only draws when WM_PAINT message is 
    //removed from input queue. 
    if(wParam == PM_NOREMOVE) return retCode; 

    MSG* message = (MSG*)lParam; 

    //Ignore everything that isn't a paint request 
    if(message->message != WM_PAINT) return retCode; 

    PAINTSTRUCT psPaint;  

    BeginPaint(message->hwnd, &psPaint); 
    //Draw your overlay here 
    ... 
    EndPaint(message->hwnd, &psPaint); 

    return retCode; 
} 

Esto es todo lo que su Win32 C# código será p/invocar pesado y correspondientemente bastante feo. Su DLL no debe ser administrado también (si tiene la intención de inyectarlo en un proceso que no sea el suyo), lo que lo convierte en una solución aún más desagradable.

Esto resolvería su problema con los problemas de z-order y clipping, ya que está renderizando en la ventana misma. Sin embargo, si la aplicación a la que se dirige hace que cualquier dibujo fuera del WinProc que responda a WM_PAINT se desmorone; esto no es una ocurrencia completamente inusual.

0

Hay problemas con el orden z, recorte, y la dirección de clics del ratón ya sea a mi solicitud o la otra aplicación .

Estas son todas las tareas que el administrador de ventanas fue diseñado para tratar. Debería crear una ventana en capas encima de las ventanas de las aplicaciones.

Consulte también: Prevent repainting of window in C++

Cuestiones relacionadas