Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Como actualizar el explorador (https://www.clubdelphi.com/foros/showthread.php?t=53620)

escafandra 04-04-2008 21:06:29

Pues la verdad, hacerlo como pretende es escabroso, pero yo creo que ya es una cuestión de curiosidad, a ver si le sale, más que por una cuestión práctica, y como él dice:
Cita:

Empezado por Negriz (Mensaje 277624)
de todas manreas voy a prbar algunas cosas, dependiendo lo que pase lo posteo, muchas rgacias por ayudarme, no saben cuanto he aprendido con esta discusion,
muchas gracias.

Negriz, prueba ese último código, puede funcionar, aunque no "al pié de la letra" según lo has citado. Experimenta. En una ocasión yo hice un programa para hacer una broma a un compañero de trabajo. Consistía en localizar cuando estaba jugando, para lo que utilizaba FindWindow y WindowFromPoint. Localizada la ventana del juego y conociendo que estaba en primer plano y con actividad (movimiento de ratón), esperaba 10 segundos y le minimizaba la ventana.....Fue divertido y aprendí mucho.

Negriz 07-04-2008 19:21:26

Cita:

Empezado por keyboy (Mensaje 277642)
Disculpen esta breve interrupción.

Me gustaría preguntarle a Negriz cuál es la necesidad de actualizar la ventana del explorador. Lo pregunto porque la API de Windows cuenta con la función ShChangeNotify, que hasta donde entiendo, sirve para notificar al shell acerca de cambios que una aplicación puede hacer que lo afecten. Eso incluye agregar o borrar archivos y directorios. Si la necesidad de actualizar la ventana del explorador viene de algo por este estilo, quizá le sea más conveniente usar la función referida y no depender así de cosas como el título de la ventana, que, como ya comentó escafandra, es poco fiable.

Bye

Lo que pasa es, supongamos que se hace un cambio en el desktop.ini de una carpeta para poner una imagen de fondo en ella; la idea es que apenas este cambio dse haga, dicha carpeta se actulize para que se vea la img.
Otro ejemplo es cuando cambias un icono con TuneUP o algun otro programa cuando aceptas los cambios, los iconos se refrescan.
algo asi mas o menos es lo que se desea hacer.

Cita:

Empezado por escafandra (Mensaje 277658)
Pues la verdad, hacerlo como pretende es escabroso, pero yo creo que ya es una cuestión de curiosidad, a ver si le sale, más que por una cuestión práctica.

En una ocasión yo hice un programa para hacer una broma a un compañero de trabajo. Consistía en localizar cuando estaba jugando, para lo que utilizaba FindWindow y WindowFromPoint. Localizada la ventana del juego y conociendo que estaba en primer plano y con actividad (movimiento de ratón), esperaba 10 segundos y le minimizaba la ventana.....Fue divertido y aprendí mucho.


Muchas gracias a todos por sus comentarios.
La verdad... eso es verdad, valga la redundancia.:D:D
yo quiero aprender y este tema me ha ayudad mucho.:eek::D

saludos desde colombia.:)

keyboy voy a mirar la funcion. gracias.

cHackAll 09-04-2008 00:23:49

Cita:

Empezado por Negriz (Mensaje 268507)
Hola de nuevo mi pregunta es que si puedo hacer que mi aplicacion al salir (onClose event) refresque el explorer, es decir como si se presionara F5 o click derecho actualizar.

muchas gracias.

Código:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
}

PD: solo para nutrir un poco el hilo :cool:

Saludos

Negriz 11-04-2008 16:09:40

Cita:

Empezado por cHackAll (Mensaje 278444)
Código:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
}

PD: solo para nutrir un poco el hilo :cool:

Saludos

Eso es lo que deseo hacer pero un poco mas especifico como haz podido leer, pero no es mala la idea, el codigo que colocaste funciona? porque la verdad no habia pensado en eso, cunado se cierre el programa que actualize.

cHackAll 14-04-2008 03:38:12

Cita:

Empezado por Negriz (Mensaje 279297)
...el codigo que colocaste funciona?

Dimelo tú ;)

Negriz 21-04-2008 02:28:14

Cita:

Empezado por cHackAll (Mensaje 279762)
Dimelo tú ;)

Si... Tienes razon...
aunque lo prbe pero lo probe y no se adapta a lo que neceisto...

ShChangeNotify... como es la sintaxis??? que pena pero mis conocimientos no son muy grandes...
Saludos y gracias.

cHackAll 21-04-2008 16:28:19

Si, también funciona;

Código:

SHSTDAPI_(void) SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 SHChangeNotify(0x8000000L/*SHCNE_ASSOCCHANGED*/, 0/*SHCNF_IDLIST*/, NULL, NULL);
}

ó

Código Delphi [-]
uses ShlObj;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;

Saludos

Negriz 30-04-2008 19:09:52

Cita:

Empezado por cHackAll (Mensaje 281436)
Si, también funciona;

Código:

SHSTDAPI_(void) SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 SHChangeNotify(0x8000000L/*SHCNE_ASSOCCHANGED*/, 0/*SHCNF_IDLIST*/, NULL, NULL);
}

ó

Código Delphi [-]
uses ShlObj;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;

Saludos

hola como estan...me disculpo por no haber dejado una respuesta en tanto tiempo.. pero es que estado un poco ocupado.

voy a probar.

Gracias

Negriz 07-05-2008 18:57:15

Nop, ya probe y no hace lo que esperaba.... aunque es muy util, ya que si cambio el autorun de la usb para darle un nuevo icono
esta funcion lo acutaliza (aveces) sin necesidad de sacarla y meterla de nuevo.

con respecto al explorer... no pasa nada.

no se si conocen el Desktop.ini
bueno un amigo me pidio que le hiziera algo donde el seleccionara la imagen y el programa le creara el desktop y le actualizara la imagen al salir....

ese es mi objetivo y por eso hize esta pregunta???

de todas maneras muchas gracias.... la verdad com dijo el amigo escafandra la verdad no esperaba averiguar tanto aca....

gracias.

Negriz 09-05-2008 21:44:55

Este es un exelente foro....
es uno de los emjores.

Grcias.

El Negriz.

Negriz 12-05-2008 19:30:58

hola...

Alguna otra sugerencia para actualizar el Desktop???

Grcias.

Negriz 26-05-2008 19:42:13

hola, gracias a todos por la ayuda.

he probado con la funcion SHChangeNotify... ahun si exito, pero creo que la solucion esta alli...

Gracias a todos...
Se acepatan sugerencias...

Saludos. El Negriz

escafandra 09-10-2008 21:52:07

Me gustaría resucitar este hilo para aportar un detalle útil en este tema, al menos para mi.

Código:

SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
Que propuso cHackAll funciona muy bien, pero al actualizar el explorador, borra los ListView y los reescribe, con lo que el efecto visual de "apagón" o "parpadeo" no es muy elegante en máquinas lentas, aunque muy efectivo.

He traceado los mensajes del explorador y he visto dos cosas interesantes:
1º Al pulsar F5 se genera un mensaje WM_COMMAND LPARAM 0x1A220 LPARAM 0

2º Al elegir la opción de menú ver \ actualizar, se genera un mensaje WM_COMMAND LPARAM 0x0A220 LPARAM 0

Así que:
Código:

  PostMessage(HWND_BROADCAST, WM_COMMAND, 0x0A220, 0);
Actualiza inmediatamente el explorador de archivos sin parpadeo, como si lo hiciésemos desde menú o pulsando F5

La pega está en que este sistema es muy dependiente del software del explorador actual y si Microsoft lo cambia dejará de funcionar, así como no funcionará, muy posiblemente, en otros exploradores.

Como curiosidad, me ha parecido interesante publicarlo.

Saludos.

escafandra 10-10-2008 21:27:45

Bueno, he de hacer una aclaración a mi post anterior.

El sistema funciona tal cual, pero SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); envía a "todas" las ventanas top-level. He comprobado que algunos elementos del Microsoft Office reaccionan mal a ese mensaje y se cuelgan.

Como la idea me sigue pareciendo buena, he creado un código para enviar el mensaje a todas las ventanas de una determinada clase (ClassName) con lo que el "bug" queda solucionado. Publico el código, considero que puede ser interesante para otras utilidades también.

Código:

// Estructura con los datos del mensaje a enviar y el nombre de la clase de ventana
struct TClassMsg{
  UINT  Msg;
  WPARAM wParam;
  LPARAM lParam;
  char*  ClassName;
};

BOOL CALLBACK EnumWindowsProc(HANDLE Handle, LPARAM lParam)
{
  int SizeBuffer = 256;
  char* Buffer = new char[SizeBuffer+1];
    TClassMsg *ClassMsg =  (TClassMsg*)lParam;
  int S = GetClassName(Handle, Buffer, SizeBuffer);
  if(S)
  if(stricmp(Buffer, ClassMsg->ClassName)==0){
      // Si coincide el ClasName con el deseado, se envía el mensaje
      PostMessage(Handle, ClassMsg->Msg, ClassMsg->wParam, ClassMsg->lParam);
  }

  delete Buffer;
  return true;
}

typedef BOOL (__stdcall *TP)();
void PostMessageToWindowClass(char *ClassName, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  TClassMsg ClassMsg;

  ClassMsg.Msg = Msg;
  ClassMsg.wParam = wParam;
  ClassMsg.lParam = lParam;
  ClassMsg.ClassName = ClassName;
 
  // Enumero las ventanas
  EnumWindows((TP)EnumWindowsProc, LPARAM(&ClassMsg));
}

Y para usarlo con los fines que propongo:
Código:

PostMessageToWindowClass("CabinetWClass", WM_COMMAND, 0x0A220, 0);
Por supuesto que puede ser mejorado y si alguien lo hace incluso lo agradezco.

Saludos.

Negriz 15-10-2008 17:49:49

pues la verdad si estab un poco muerto, voy a mirar gracias.

Negriz 07-11-2008 22:48:59

pues va de maravilla, muchas gracias...


La franja horaria es GMT +2. Ahora son las 00:37:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi