Ir al contenido


Foto

Repintar todas las ventanas de un proceso


  • Por favor identifícate para responder
3 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 04 octubre 2015 - 09:31

Me surgió la necesidad de tener que obligar a un proceso a repintarse conociendo sólo su PID, para ello escribí este código:
 


delphi
  1. procedure ReDrawWindows(PID: DWORD);
  2. function EnumWindowsProc(Wnd: HWND; PID: PDWORD): BOOL; stdcall;
  3. var
  4. _PID: DWORD;
  5. cr: TRect;
  6. begin
  7. GetWindowThreadProcessId(Wnd, _PID);
  8. if PID^ = _PID then
  9. begin
  10. Windows.GetClientRect(Wnd, cr);
  11. InvalidateRect(Wnd, @cr, true);
  12. RedrawWindow(Wnd, @cr, 0, RDW_FRAME + RDW_ERASE + RDW_INVALIDATE + RDW_UPDATENOW + RDW_ALLCHILDREN);
  13. end;
  14. Result:= true;
  15. end;
  16. begin
  17. EnumWindows(@EnumWindowsProc, LPARAM(@PID));
  18. end;

Saludos.


  • 2

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 04 octubre 2015 - 09:37

El mismo truco en C/C++


cpp
  1. void ReDrawWindows(DWORD PID)
  2. {
  3. struct TWinParam{
  4. static BOOL CALLBACK EnumWindowsProc(HWND hWnd, DWORD* Pid){
  5. DWORD PId = 0;
  6. GetWindowThreadProcessId(hWnd, &PId);
  7. if(*Pid == PId){
  8. TRect cr;
  9. ::GetClientRect(hWnd, &cr);
  10. InvalidateRect(hWnd, &cr, true);
  11. RedrawWindow(hWnd, &cr, 0, RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN);
  12. }
  13. return true;
  14. }
  15. } WinParam;
  16. EnumWindows((PROC)TWinParam::EnumWindowsProc, LPARAM(&PID));
  17. }

Saludos.


  • 1

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 05 octubre 2015 - 05:43

Muy bueno Escafandra. Lo bueno es que se llama a petición y no mediante evento.

No recuerdo bien, pero creo que si pasás nil en el parámetro TRect, se repinta todo el ClientRect y no habría necesidad de obtener sus propiedades.

Gracias.

 

Saludos.

(b)


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 05 octubre 2015 - 06:22

...creo que si pasás nil en el parámetro TRect, se repinta todo el ClientRect y no habría necesidad de obtener sus propiedades....


Cierto, así es, peor al querer obligar a repintarse el FRAME y todas las ventanas hijas, ya si se precisa conocer el valor para poder usar RedrawWindow

 

 

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.