elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Refrescar Escritorio de Windows y Explorador de Carpetas (solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Refrescar Escritorio de Windows y Explorador de Carpetas (solucionado)  (Leído 3,896 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Refrescar Escritorio de Windows y Explorador de Carpetas (solucionado)
« en: 10 Marzo 2015, 16:52 pm »

Hola,
He buscado y rebuscado en la red y finalmente encontré la forma de refrescar el escritorio de windows y el Explorador de carpetas (Explorer)

Esto sirve para cuando cambias valores en el registro directamente desde tu programa, en lugar de usar Opciones de Carpeta. Por ejemplo, ocultar las extensiones de archivo, mostrar archivos ocultos o  mostrar vistas en miniaturas en lugar de iconos. Al refrescar automáticamente se muestran los cambios; si deshabilitas las extensiones de archivo, al refrescar (actualizar) se ocultan las extensiones.

Yo intuía que debía usar PostMessage o SendMessage, lo que no sabía era que comando usar. Finalmente los encontré pero referido a otros tipos de lenguaje, no para VB. He encontrado otras formas con VB pero no funcionaban o solamente funcionaban para el escritorio. Como explico más abajo, todo se tiene que hacer por separado: escritorio, explorador de windows y actualizar iconos.


Código completo y definitivo para refrescar el escritorio, el explorador de carpetas y ACTUALIZAR LOS ICONOS en XP/Vista/¿Windows 7/8?:

Código
  1. Option Explicit
  2. Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
  3. (ByVal hwnd As Long, ByVal wMsg As Long, _
  4. ByVal wParam As Long, ByVal lParam As Long) As Long
  5. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  6. (ByVal hwnd As Long, ByVal wMsg As Long, _
  7. ByVal wParam As Long, lParam As Any) As Long
  8. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  9. (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  10. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  11. (ByVal hWnd1 As Long, _
  12. ByVal hWnd2 As Long, _
  13. ByVal lpsz1 As String, _
  14. ByVal lpsz2 As String) As Long
  15.  
  16. Private Const WM_COMMAND = &H111
  17. Private Const SC_REFRESH_DESKTOP = &H7103
  18. Private Const SC_REFRESH_EXPLORER_VISTA = &HA220
  19. Private Const SC_REFRESH_EXPLORER_XP = &H7FEF
  20.  
  21. 'Función para actualizar los iconos
  22. Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" _
  23. (ByVal hwnd As Long, ByVal msg As Long, _
  24. ByVal wParam As Long, ByVal lParam As Long, _
  25. ByVal fuFlags As Long, ByVal uTimeout As Long, _
  26. lpdwResult As Long) As Long
  27.  
  28. Private Const WM_SETTINGCHANGE = &H1A
  29. Private Const HWND_BROADCAST = &HFFFF&
  30. Private Const SPI_SETNONCLIENTMETRICS = 42
  31. Private Const SMTO_ABORTIFHUNG = &H2
  32.  
  33.  
  34. Public Function RefreshDesktop()
  35. Dim hwProgMan As Long, hwDesktop As Long, hwExplorer As Long
  36.  
  37. 'Refresca el escritorio
  38. hwProgMan = FindWindow("Progman", "Program Manager")
  39. hwDesktop = FindWindowEx(hwProgMan, &H0, "SHELLDLL_DefView", vbNullString)
  40. PostMessage hwDesktop, WM_COMMAND, SC_REFRESH_DESKTOP, &H0
  41.  
  42. 'Refresca explorer
  43. 'VISTA/¿Windows 7/8?
  44. hwExplorer = FindWindow("CabinetWClass", vbNullString)
  45. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_VISTA, &H0
  46. 'XP
  47. hwExplorer = FindWindow("ExploreWClass", vbNullString)
  48. PostMessage hwExplorer, WM_COMMAND, SC_REFRESH_EXPLORER_XP, &H0
  49.  
  50. 'Actualiza los iconos
  51. Call SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, &H0, SMTO_ABORTIFHUNG, &H1, &H0)
  52. End Function
  53.  
  54. Private Sub Command1_Click()
  55. RefreshDesktop
  56. End Sub

'//////////////////
Tuve una errata ayer con el nombre de clase del explorador de windows para Windows XP; le añadí una R de más. La culpa es de google :¬¬ Como no estaba seguro busqué ahí y encontre referencias escrito así y bueno, esa es la escusa. Lo he corregido :D.

El nombre de clase de Explorer para XP es: "ExploreWClass". Con toda seguridad, lo he comprobado personalmente.

De todos modos el código o comando para refrescar Explorer en XP es diferente que en Vista o Windows 7. De modo que tampoco iba a funcionar aunque hubiera escrito bien el nombre de clase. Ayer comprobé cual era el comando a usar con spy++ y lo he añadido.

He añadido además el código para actualizar los iconos porque no se actualizaban los iconos. Esto es, cuando cambias el icono por defecto de una determinada extensión de archivo directamente en el registro de windows y quieres ver los cambios sin tener que cerrar sesión o simular un cambio en Opciones de carpeta.

No me extraña que no encontrara la forma de refrescar windows. Parece ser que hay que hacerlo todo por separado, por un lado el escritorio, por el otro Explorer y por el otro actualizar los iconos.


Como se puede ver, en XP el código wParam es &H7FEF=32751. Lo he testado y ¡funciona!.


« Última modificación: 11 Marzo 2015, 12:05 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Source] Explorador de carpetas remoto (File Manager) « 1 2 »
Programación Visual Basic
~~ 13 6,524 Último mensaje 15 Enero 2010, 20:51 pm
por BlackZeroX
C#: Explorador de carpetas
.NET (C#, VB.NET, ASP)
Layyer 4 13,780 Último mensaje 20 Octubre 2007, 19:07 pm
por Layyer
[Solucionado] JAVA Como Refrescar JTable « 1 2 »
Java
MiguelP 17 21,846 Último mensaje 22 Marzo 2014, 21:32 pm
por Debci
[Jquery] Problema refrescar DIV (SOLUCIONADO)
Desarrollo Web
Yugget 5 10,453 Último mensaje 29 Junio 2014, 13:57 pm
por Yugget
crear explorador de archivos y carpetas en bath?
Scripting
**Aincrad** 2 2,997 Último mensaje 15 Julio 2017, 20:12 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines