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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?  (Leído 8,006 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« en: 21 Noviembre 2012, 19:17 pm »

Hola,

Como sabreis.. hay muchisimos programas que hacen cambios en el registro (TuneUp por ejemplo) y los cambios tienen efecto enseguida sin necesidad de reiniciar el PC,
Si algunos de esos cambios se hicieran manualmente (batch, o añadiendo la clave desde el regedit) habría que reiniciar la sesión del usuario o el pc para que los cambios surgieran efecto...

Pues yo necesito añadir esta clave al registro:
Código
  1. My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "HideDrivesWithNoMedia", 1, Microsoft.Win32.RegistryValueKind.DWord)


Y lo que me gustaría es hacer un "system refresh" para que los cambios de esa clave tengan efecto sin tener que reiniciar...



Encontré este ejemplo en C# pero no tengo ni idea de lo que hace, ni tampoco sé si esto sirve para mi propósito.


Código
  1. static class SafeNativeMethods
  2. {
  3. public static IntPtr HWND_BROADCAST = (IntPtr)0xffff;
  4. public static int WM_WININICHANGE = 0x001A;
  5.  
  6. [DllImport("User32.Dll")]
  7. public static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int
  8. lParam);
  9. }
  10.  
  11. public static class Refresher
  12. {
  13. public static void ReloadSettings()
  14. {
  15. SafeNativeMethods.PostMessage(SafeNativeMethods.HWND_BROADCAST,
  16. SafeNativeMethods.WM_WININICHANGE, 0, 5000);
  17. }
  18. }
  19.  
  20. static void ExWin()
  21. {
  22. Form form = new Form();
  23. Refresher.ReloadSettings();
  24. Application.Run(form);
  25. }


En línea


seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #1 en: 21 Noviembre 2012, 19:53 pm »

fijate este ejemplo, lo pasas facil desde C#

Registry settings immediate effect using C#

lo que hace es con la api SendMessage justamente envia un mensaje de windows, en este caso la constante WM_SETTINGCHANGE y las aplicaciones son notificadas del cambio, en teoria deberia funcionar, probalo.


En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #2 en: 21 Noviembre 2012, 20:03 pm »

Cita de: stackoverflow
Código
  1. private const int HWND_BROADCAST = 0xffff;
  2. private const int WM_WININICHANGE = 0x001a, WM_SETTINGCHANGE = WM_WININICHANGE, INI_INTL = 1;
  3.  
  4. SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, INI_INTL);
  5.  
  6. [DllImport("user32.dll")]
  7. private static extern int SendMessage(int hWnd, uint wMsg, uint wParam, uint lParam);

Gracias pero no me deja convertirlo



en los convertidores online me da el mismo error  :-\

(No se hacer la conversión manual, sinceramente)
En línea


seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #3 en: 21 Noviembre 2012, 20:18 pm »

proba asi:

Código
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public Class Form1
  4.  
  5.    Private Const HWND_BROADCAST As Integer = &HFFFF
  6.    Private Const WM_WININICHANGE As Integer = &H1A, WM_SETTINGCHANGE As Integer = WM_WININICHANGE, INI_INTL As Integer = 1
  7.  
  8.    <DllImport("user32.dll")> _
  9.    Private Shared Function SendMessage(ByVal hWnd As Integer, ByVal wMsg As UInteger, ByVal wParam As UInteger, ByVal lParam As UInteger) As Integer
  10.    End Function
  11.  
  12.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  13.        Call SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, INI_INTL)
  14.    End Sub
  15. End Class
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #4 en: 25 Noviembre 2012, 17:54 pm »

No me ha funcionado Seba
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #5 en: 11 Diciembre 2012, 18:05 pm »

¿Alguien puede echarme una mano?

Me gustaría ir paso por paso con esta APP y el problema es que no sé mandar el post adecuado en la API para poder refescar el sistema, intento refrescar los iconos de "Mi PC", debería salir un nuevo dispositivo conectado/ocultado al refrescar,
me niego a continuar desarrollando esta APP sin poder resolver ese detalle (Quiero hacer las cosas bien xD).

He probado distintas combinaciones, tanto con "PostMessage" como "SendMessage":

Código
  1.    <DllImport("user32.dll")> _
  2.    Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean
  3.    End Function
  4.    Private Shared Function SendMessage(ByVal hWnd As Integer, ByVal wMsg As UInteger, ByVal wParam As UInteger, ByVal lParam As UInteger) As Integer
  5.    End Function
   
Código
  1.    My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "HideDrivesWithNoMedia", 1, Microsoft.Win32.RegistryValueKind.DWord)
  2.    Call PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, INI_INTL)

Gracias por leer.
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #6 en: 12 Enero 2013, 18:44 pm »

Sigo sin saber nada xD.

En línea


apuromafo CLS


Desconectado Desconectado

Mensajes: 1.427



Ver Perfil WWW
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #7 en: 23 Enero 2013, 08:40 am »

en caso x que necesites otro conversor

http://www.elguille.info/NET/WebServices/deCSaVB_web.aspx
respecto a tu codigo en c, en conversor es asi
Código:
Class SafeNativeMethods
Public Shared HWND_BROADCAST As IntPtr = CType(0xffff,IntPtr)
Public Shared WM_WININICHANGE As Integer = 0x001A
(DllImport("User32.Dll")) public static extern Boolean PostMessage(IntPtr hWnd, Integer Msg, Integer wParam, Integer lParam)
End Class

Public Class Refresher
Public Shared Sub ReloadSettings()
SafeNativeMethods.PostMessage(SafeNativeMethods.HWND_BROADCAST, SafeNativeMethods.WM_WININICHANGE, 0, 5000)
End Sub

End Class

Shared Sub ExWin()
Dim form As New Form()
Refresher.ReloadSettings()
Application.Run(form)
End Sub


a primera vista es similar a codigo planteado en
http://helpnet.flexerasoftware.com/installshield17helplib/GetresEnv_variable_example.htm

no se que tipo de refrescar se puede complementar
http://techtastico.com/post/como-refrescar-la-memoria-ram-del-pc-con-el-bloc-de-notas/
o si bien es asi
http://foro.elhacker.net/windows/ayudacomando_para_refrescar_como_apretar_f5-t251089.0.html


o lo mas simple confirmar el valor con lectura en regedit
http://www.ayudadigital.com/windows/como_actualizar_iconos_escritorio.htm
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #8 en: 23 Enero 2013, 09:37 am »

Estoy casi seguro que se requiere usar la api con sendmessage o postmessage,

gracias por la info, pero he intentado convertir los dos códigos de aquí a VB, y en ningún convertidor funciona: http://helpnet.flexerasoftware.com/installshield17helplib/GetresEnv_variable_example.htm
(¿Alguien que domine C# puede ayudarme a convertirlos?)

He intentado los demás ejemplos pero sólo refrescan el escritorio.



Esto es lo que intento reproducir en mi aplicación, que es una aplicación para monitorizar USBs:

* En Windows 7 > Opciones de carpeta > "Ocultar unidades vacías en la carpeta Equipo"

Al activar la opción, Windows hace un refrescado de sistema ocultando los pendrives vacíos, es un refrescado..."especial" que no es lo mismo que apretar "F5" para refrescar el escritorio.
En línea


apuromafo CLS


Desconectado Desconectado

Mensajes: 1.427



Ver Perfil WWW
Re: Como aplicar cambios al registro y refrescar el sistema sin tener que reiniciar?
« Respuesta #9 en: 23 Enero 2013, 14:48 pm »

ok, esta dificil encontrar referencia
pillo a lo mas esta informacion sobre las unidades
http://msmvps.com/blogs/dmartin/archive/2010/01/25/la-opci-243-n-quot-ocultar-unidades-vac-237-as-en-la-carpeta-equipo-quot-no-hace-lo-que-mucha-gente-cree.aspx
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines