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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Temas
Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12
51  Programación / .NET (C#, VB.NET, ASP) / Cambiar vistas de iconos del escritorio en Windows en: 3 Octubre 2016, 16:06 pm
Ayer estuve repasando mis códigos y encontré uno viejo que tenía de ejemplo para enviar mensajes a una ventana y lo he pasado a NET. Consiste en cambiar las vistas a de los iconos del escritorio, quitar las etiquetas y ocultar.

Código:
     
Iconos Muy Grandes
Iconos Grandes
Iconos Medianos
Iconos Pequeños
Lista
Detalle
Mosaico
Contenido

Si eres de es@s que les gusta llenar el escritorio de iconos esto te vendrá de lujo, porque puedes ponerlo en modo Lista o detalle, permitiendo una forma ordenada y reduciendo notablemente el espacio y tamaño de los iconos. Esto es posible porque el lugar donde se encuentran los iconos del escritorio es en realidad el equivalente a un ListView cuyo nombre de clase es SHELLDLL_DefView.


El 'snippet' que permite esta acción es el siguiente:
Código
  1. ''' <summary>
  2. ''' Clase NativeMethods
  3. ''' </summary>
  4. ''' <remarks></remarks>
  5. <System.Security.SuppressUnmanagedCodeSecurity()>
  6. Friend NotInheritable Class NativeMethods
  7.    Inherits Attribute
  8.    Private Sub New()
  9.    End Sub
  10.    ''' <summary>
  11.    ''' Función que devuelve el identificador de una ventana
  12.    ''' </summary>
  13.    ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
  14.    ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
  15.    ''' <returns></returns>
  16.    ''' <remarks></remarks>
  17.    <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
  18.    Private Shared Function FindWindow(
  19.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
  20.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
  21.    End Function
  22.  
  23.    ''' <summary>
  24.    ''' Recupera un identificador a una ventana cuyo nombre de clase
  25.    ''' y nombre de la ventana que coincida con las cadenas especificadas.
  26.    ''' La función busca en ventanas secundarias, comenzando por la raíz de la
  27.    ''' ventana secundaria especificada. Esta función no realiza una búsqueda
  28.    ''' entre mayúsculas y minúsculas.
  29.    ''' </summary>
  30.    ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
  31.    ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
  32.    ''' <param name="lpsz1">El nombre de la clase o un átomo de clase creada por una llamada previa a la RegisterClass o RegisterClassEx función</param>
  33.    ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
  34.    ''' <returns></returns>
  35.    ''' <remarks></remarks>
  36.    <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
  37.    Private Shared Function FindWindowEx(
  38.                                        ByVal hWnd1 As IntPtr,
  39.                                        ByVal hWnd2 As IntPtr,
  40.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
  41.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr
  42.  
  43.    End Function
  44.    ''' <summary>
  45.    ''' Envía el mensaje especificado a una ventana o ventanas.
  46.    ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
  47.    ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
  48.    ''' </summary>
  49.    ''' <param name="hwnd">Un identificador de la ventana</param>
  50.    ''' <param name="wMsg">El mensaje que se enviará.</param>
  51.    ''' <param name="wParam">Información adicional-mensaje específico.</param>
  52.    ''' <param name="lParam">Información adicional-mensaje específico.</param>
  53.    ''' <returns></returns>
  54.    ''' <remarks></remarks>
  55.    <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
  56.    Private Shared Function SendMessage(ByVal hwnd As IntPtr,
  57.                                        ByVal wMsg As Integer,
  58.                                        ByVal wParam As Integer,
  59.                                        lParam As Integer) As Boolean
  60.    End Function
  61.  
  62.    Private Const WM_COMMAND = &H111
  63.    ''' <summary>
  64.    ''' Valores wParam para SendMessage que cambia el estilo de visualización
  65.    ''' del escritorio
  66.    ''' </summary>
  67.    ''' <remarks></remarks>
  68.    Public Enum viewOptIcon As Integer
  69.        vIconosMuyGrandes = &H704D
  70.        vIconosGrandes = &H704F
  71.        vIconosMedianos = &H704E
  72.        vIconosPequeños = &H7050
  73.        vLista = &H7051
  74.        vDetalle = &H704B
  75.        vContenido = &H7052
  76.        vMosaico = &H704C
  77.        vOcultarIconos = &H7073 '(no bloquea el escritorio)
  78.        vQuitarEtiquetas = &H7037
  79.    End Enum
  80.  
  81.    ''' <summary>
  82.    ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
  83.    ''' </summary>
  84.    ''' <param name="intValueView">Valor wParam para SendMessage</param>
  85.    ''' <remarks></remarks>
  86.    Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
  87.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  88.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  89.        SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
  90.    End Sub
  91.  
  92. End Class
  93.  

Para usarlo se realiza de la forma siguiente:
Código
  1. NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vLista)


Aquí dejo un código completo de ejemplo para cambiar todas las vistas:


Código
  1. Imports System.Runtime.InteropServices
  2.  
  3. Public NotInheritable Class Form1 : Inherits Form
  4.    Friend rdButton(7) As RadioButton
  5.    Friend chkBox(1) As CheckBox
  6.    Sub New()
  7.  
  8.        ' Llamada necesaria para el diseñador.
  9.        InitializeComponent()
  10.  
  11.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  12.        Dim N As Integer = 10
  13.        For Index As Integer = 0 To 7
  14.            rdButton(Index) = New RadioButton With {.AutoSize = True, .Location = New Point(10, N)}
  15.            N = N + 20
  16.            AddHandler rdButton(Index).Click, AddressOf rdButton_Click
  17.        Next Index
  18.        rdButton(0).Text = "Iconos Muy Grandes"
  19.        rdButton(1).Text = "Iconos Grandes"
  20.        rdButton(2).Text = "Iconos Medianos"
  21.        rdButton(3).Text = "Iconos Pequeños"
  22.        rdButton(4).Text = "Lista"
  23.        rdButton(5).Text = "Detalle"
  24.        rdButton(6).Text = "Mosaico"
  25.        rdButton(7).Text = "Contenido"
  26.        rdButton(3).Checked = True
  27.  
  28.        chkBox(0) = New CheckBox With {
  29.            .Location = New Point(10, rdButton(7).Top + 30), .AutoSize = True,
  30.            .Text = "Ocultar/Mostrar Etiquetas (Solo en modo Icono y Detalle)"
  31.        }
  32.        chkBox(1) = New CheckBox With {
  33.            .Location = New Point(10, chkBox(0).Top + 25), .AutoSize = True,
  34.            .Text = "Ocultar/Mostrar Iconos"
  35.        }
  36.        For Index As Integer = 0 To 1
  37.            AddHandler chkBox(Index).CheckedChanged, AddressOf chkBox_CheckedChanged
  38.        Next
  39.  
  40.  
  41.    End Sub
  42.    Private Sub chkBox_CheckedChanged(sender As Object, e As EventArgs)
  43.        Dim Index As Integer = Array.IndexOf(chkBox, sender)
  44.        Select Case Index
  45.            Case 0
  46.                If chkBox(1).Checked = True Then
  47.                    NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vQuitarEtiquetas)
  48.                Else
  49.                    NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vQuitarEtiquetas)
  50.                End If
  51.  
  52.            Case 1
  53.                If chkBox(0).Checked = True Then
  54.                    NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vOcultarIconos)
  55.                Else
  56.                    NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vOcultarIconos)
  57.                End If
  58.        End Select
  59.  
  60.  
  61.        'NOTA:
  62.        'Ten en cuenta que esta aplicación no tiene medio para saber, al iniciarse, si el escritorio tiene
  63.        'los iconos ocultos o no, o sin etiquetas, para establecer el valor verdadero o falso de
  64.        'los objetos CheckBox
  65.    End Sub
  66.    Private Sub rdButton_Click(sender As Object, e As EventArgs)
  67.        Dim Index As Integer = Array.IndexOf(rdButton, sender)
  68.        Select Case Index
  69.            Case 0 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosMuyGrandes)
  70.            Case 1 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosGrandes)
  71.            Case 2 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosMedianos)
  72.            Case 3 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosPequeños)
  73.            Case 4 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vLista)
  74.            Case 5 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vDetalle)
  75.            Case 6 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vContenido)
  76.            Case 7 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vMosaico)
  77.  
  78.        End Select
  79.  
  80.  
  81.  
  82.    End Sub
  83.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  84.        For Index As Integer = 0 To 7
  85.            Me.Controls.Add(Me.rdButton(Index))
  86.        Next
  87.        For Index As Integer = 0 To 1
  88.            Me.Controls.Add(Me.chkBox(Index))
  89.        Next
  90.    End Sub
  91.  
  92.    Private Sub Button1_Click(sender As Object, e As EventArgs)
  93.  
  94.    End Sub
  95. End Class
  96. ''' <summary>
  97. ''' Clase NativeMethods
  98. ''' </summary>
  99. ''' <remarks></remarks>
  100. <System.Security.SuppressUnmanagedCodeSecurity()>
  101. Friend NotInheritable Class NativeMethods
  102.    Inherits Attribute
  103.    Private Sub New()
  104.    End Sub
  105.    ''' <summary>
  106.    ''' Función que devuelve el identificador de una ventana
  107.    ''' </summary>
  108.    ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
  109.    ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
  110.    ''' <returns></returns>
  111.    ''' <remarks></remarks>
  112.    <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
  113.    Private Shared Function FindWindow(
  114.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
  115.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
  116.    End Function
  117.  
  118.    ''' <summary>
  119.    ''' Recupera un identificador a una ventana cuyo nombre de clase
  120.    ''' y nombre de la ventana que coincida con las cadenas especificadas.
  121.    ''' La función busca en ventanas secundarias, comenzando por la raíz de la
  122.    ''' ventana secundaria especificada. Esta función no realiza una búsqueda
  123.    ''' entre mayúsculas y minúsculas.
  124.    ''' </summary>
  125.    ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
  126.    ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
  127.    ''' <param name="lpsz1">El nombre de la clase o un átomo de clase creada por una llamada previa a la RegisterClass o RegisterClassEx función</param>
  128.    ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
  129.    ''' <returns></returns>
  130.    ''' <remarks></remarks>
  131.    <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
  132.    Private Shared Function FindWindowEx(
  133.                                        ByVal hWnd1 As IntPtr,
  134.                                        ByVal hWnd2 As IntPtr,
  135.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
  136.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr
  137.  
  138.    End Function
  139.    ''' <summary>
  140.    ''' Envía el mensaje especificado a una ventana o ventanas.
  141.    ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
  142.    ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
  143.    ''' </summary>
  144.    ''' <param name="hwnd">Un identificador de la ventana</param>
  145.    ''' <param name="wMsg">El mensaje que se enviará.</param>
  146.    ''' <param name="wParam">Información adicional-mensaje específico.</param>
  147.    ''' <param name="lParam">Información adicional-mensaje específico.</param>
  148.    ''' <returns></returns>
  149.    ''' <remarks></remarks>
  150.    <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
  151.    Private Shared Function SendMessage(ByVal hwnd As IntPtr,
  152.                                        ByVal wMsg As Integer,
  153.                                        ByVal wParam As Integer,
  154.                                        lParam As Integer) As Boolean
  155.    End Function
  156.  
  157.    Private Const WM_COMMAND = &H111
  158.    ''' <summary>
  159.    ''' Valores wParam para SendMessage que cambia el estilo de visualización
  160.    ''' del escritorio
  161.    ''' </summary>
  162.    ''' <remarks></remarks>
  163.    Public Enum viewOptIcon As Integer
  164.        vIconosMuyGrandes = &H704D
  165.        vIconosGrandes = &H704F
  166.        vIconosMedianos = &H704E
  167.        vIconosPequeños = &H7050
  168.        vLista = &H7051
  169.        vDetalle = &H704B
  170.        vContenido = &H7052
  171.        vMosaico = &H704C
  172.        vOcultarIconos = &H7073 '(no bloquea el escritorio)
  173.        vQuitarEtiquetas = &H7037
  174.    End Enum
  175.  
  176.    ''' <summary>
  177.    ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
  178.    ''' </summary>
  179.    ''' <param name="intValueView">Valor wParam para SendMessage</param>
  180.    ''' <remarks></remarks>
  181.    Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
  182.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  183.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  184.        SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
  185.    End Sub
  186.  
  187. End Class
  188.  




se me olvidaba, tiene un pero y es que si se deja en modo Lista en un principio la lista se ve en modo vertical, pero  al reiniciar o cerrar sesión, la lista se extiende horizontalmente, y claro ya no queda bien. La manera de volver a conseguir la lista vertical es cambiar a modo icono, cerrar sesión y volver a establecer modo lista.

No se si alguien sabrá porque ocurre esto y si hay forma de solventarlo.

chau



Como  el estado de modo detalle no se ve alterado al reiniciar o cerrar sesión de windows, se me ha ocurrido ocultar/mostrar la barra cabecera de columnas a mi antojo, de la siguiente manera:
Código
  1.   ''' <summary>
  2.    ''' Oculta la cabecera del modo 'Detalle' del escritorio
  3.    ''' </summary>
  4.    ''' <param name="sH32State">Valor ncmdShow para ShowWindow// True=Hide, False=Normal </param>
  5.    ''' <remarks></remarks>
  6.    Public Shared Sub HideHeaderListView(ByVal sH32State As Boolean)
  7.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  8.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  9.        Dim hSysListView32 As IntPtr = FindWindowEx(hDefView, IntPtr.Zero, "SysListView32", vbNullString)
  10.        Dim hSysHeader32 As IntPtr = FindWindowEx(hSysListView32, IntPtr.Zero, "SysHeader32", vbNullString)
  11.        ShowWindow(hSysHeader32, Convert.ToInt32(sH32State))
  12.    End Sub
  13.  

para ocultar se llamaría así

Código
  1. HideHeaderListView(True)


hoy he cambiado HideColumnListView por HideHeaderListView para evitar confusión. Ya que en realidad oculta la cabecera no la columna.

chau


6 Octubre 2016, 17:50

WorkerW
Hoy he ejecutado el código en otro ordenador con W764bits, y se me ha planteado un problema y es que este ordenador tiene el objeto Listview de nombre de clase SHELLDLL_DefView en WorkerW, y Progman no tiene ventanas "hijo".  Como resultado el snippet no funciona  :P

Resulta que hay más de una ventana con nombre de clase WorkerW. Me he tirado un buen rato intentado encontrar la manera de encontrar el correcto.  

En realidad es simple vas rastreando  en un bucle todos las ventanas hasta que des con una con hijo que tenga nombre de clase SHELLDLL_DefView.

Código
  1.  ''' <summary>
  2.    ''' Obtiene el identificador de WorkerW del escritorio
  3.    ''' </summary>
  4.    ''' <returns></returns>
  5.    ''' <remarks></remarks>
  6.    Public Shared Function GetHWorkerW() As IntPtr
  7.        Dim ClassNameChild As New System.Text.StringBuilder(255)
  8.        Dim hWorkerW As IntPtr
  9.        Dim hwnd As IntPtr = FindWindow(Nothing, Nothing)
  10.        Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
  11.            hwnd = GetNextWindow(hwnd, GW_Const.GW_HWNDNEXT)
  12.            hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
  13.            GetClassName(hWorkerW, ClassNameChild, 260)
  14.        Loop
  15.        Return hwnd
  16.    End Function
  17.    '//Otra forma de obtener el handle de WorkerW
  18.    ' ''' <summary>
  19.    ' ''' Obtiene el identificador de WorkerW del escritorio
  20.    ' ''' </summary>
  21.    ' ''' <returns></returns>
  22.    ' ''' <remarks></remarks>
  23.    'Public Shared Function GetHWorkerW() As IntPtr
  24.    '    Dim ClassNameChild As New System.Text.StringBuilder(255)
  25.    '    Dim hWorkerW As IntPtr
  26.    '    Dim hwnd As IntPtr = FindWindow("Progman", Nothing)
  27.    '    Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
  28.    '        hwnd = GetWindow(hwnd, GW_Const.GW_HWNDPREV)
  29.    '        hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
  30.    '        GetClassName(hWorkerW, ClassNameChild, 260)
  31.    '    Loop
  32.    '    Return hwnd
  33.    'End Function


Modificando el  código quedaría así .

Código
  1. ''' <summary>
  2. ''' Clase NativeMethods
  3. ''' </summary>
  4. ''' <remarks></remarks>
  5. <System.Security.SuppressUnmanagedCodeSecurity()>
  6. Friend NotInheritable Class NativeMethods
  7.    Inherits Attribute
  8.    Private Sub New()
  9.    End Sub
  10.    ''' <summary>
  11.    ''' Función que devuelve el identificador de una ventana
  12.    ''' </summary>
  13.    ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
  14.    ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
  15.    ''' <returns></returns>
  16.    ''' <remarks></remarks>
  17.    <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
  18.    Private Shared Function FindWindow(
  19.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
  20.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
  21.    End Function
  22.  
  23.    ''' <summary>
  24.    ''' Recupera un identificador a una ventana cuyo nombre de clase
  25.    ''' y nombre de la ventana que coincida con las cadenas especificadas.
  26.    ''' La función busca en ventanas secundarias, comenzando por la raíz de la
  27.    ''' ventana secundaria especificada. Esta función no realiza una búsqueda
  28.    ''' entre mayúsculas y minúsculas.
  29.    ''' </summary>
  30.    ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
  31.    ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
  32.    ''' <param name="lpsz1">El nombre de la clase o un átomo de clase creada por una llamada previa a la RegisterClass o RegisterClassEx función</param>
  33.    ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
  34.    ''' <returns></returns>
  35.    ''' <remarks></remarks>
  36.    <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
  37.    Private Shared Function FindWindowEx(
  38.                                        ByVal hWnd1 As IntPtr,
  39.                                        ByVal hWnd2 As IntPtr,
  40.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
  41.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr
  42.  
  43.    End Function
  44.    ''' <summary>
  45.    ''' Envía el mensaje especificado a una ventana o ventanas.
  46.    ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
  47.    ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
  48.    ''' </summary>
  49.    ''' <param name="hwnd">Un identificador de la ventana</param>
  50.    ''' <param name="wMsg">El mensaje que se enviará.</param>
  51.    ''' <param name="wParam">Información adicional-mensaje específico.</param>
  52.    ''' <param name="lParam">Información adicional-mensaje específico.</param>
  53.    ''' <returns></returns>
  54.    ''' <remarks></remarks>
  55.    <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
  56.    Private Shared Function SendMessage(ByVal hwnd As IntPtr,
  57.                                        ByVal wMsg As Integer,
  58.                                        ByVal wParam As Integer,
  59.                                        lParam As Integer) As Boolean
  60.    End Function
  61.  
  62.    <DllImport("user32.dll")> _
  63.    Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
  64.    End Function
  65.  
  66.    Private Const WM_COMMAND = &H111
  67.    ''' <summary>
  68.    ''' Valores wParam para SendMessage que cambia el estilo de visualización
  69.    ''' del escritorio
  70.    ''' </summary>
  71.    ''' <remarks></remarks>
  72.    Public Enum viewOptIcon As Integer
  73.        vIconosMuyGrandes = &H704D
  74.        vIconosGrandes = &H704F
  75.        vIconosMedianos = &H704E
  76.        vIconosPequeños = &H7050
  77.        vLista = &H7051
  78.        vDetalle = &H704B
  79.        vContenido = &H7052
  80.        vMosaico = &H704C
  81.        vOcultarIconos = &H7073 '(no bloquea el escritorio)
  82.        vQuitarEtiquetas = &H7037
  83.    End Enum
  84.    Public Const GW_HWNDNEXT = 2
  85.  
  86.    <DllImport("user32", EntryPoint:="GetWindow", SetLastError:=True)> _
  87.    Public Shared Function GetNextWindow(ByVal hwnd As IntPtr, ByVal wFlag As Integer) As IntPtr
  88.    End Function
  89.    <DllImport("user32", SetLastError:=True)> _
  90.    Private Shared Function GetWindow(ByVal hwnd As IntPtr, ByVal wCmd As Integer) As IntPtr
  91.    End Function
  92.  
  93.    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  94.    Private Shared Function GetClassName(ByVal hWnd As System.IntPtr, _
  95.   ByVal lpClassName As System.Text.StringBuilder, _
  96.   ByVal nMaxCount As Integer) As Integer
  97.    End Function
  98.  
  99.    Public Enum GW_Const
  100.        GW_CHILD = 5
  101.        GW_HWNDFIRST = 0
  102.        GW_HWNDLAST = 1
  103.        GW_HWNDNEXT = 2
  104.        GW_HWNDPREV = 3
  105.        GW_MAX = 5
  106.        GW_OWNER = 4
  107.    End Enum
  108.    ''' <summary>
  109.    ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
  110.    ''' </summary>
  111.    ''' <param name="intValueView">Valor wParam para SendMessage</param>
  112.    ''' <remarks></remarks>
  113.    Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
  114.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  115.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
  116.  
  117.        If hDefView = IntPtr.Zero Then
  118.            Dim hWorkerW As IntPtr = GetHWorkerW()
  119.            hDefView = FindWindowEx(hWorkerW, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
  120.        End If
  121.        SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
  122.    End Sub
  123.  
  124.    ''' <summary>
  125.    ''' Oculta las cabeceras de modo 'detalle' del escritorio
  126.    ''' </summary>
  127.    ''' <param name="sH32State">Valor ncmdShow para ShowWindow// True=Hide, False=Normal </param>
  128.    ''' <remarks></remarks>
  129.    Public Shared Sub HideHeaderListView(ByVal sH32State As Boolean)
  130.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  131.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
  132.        If hDefView = IntPtr.Zero Then
  133.            Dim hWorkerW As IntPtr = GetHWorkerW()
  134.            hDefView = FindWindowEx(hWorkerW, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
  135.        End If
  136.        Dim hSysListView32 As IntPtr = FindWindowEx(hDefView, IntPtr.Zero, "SysListView32", Nothing)
  137.        Dim hSysHeader32 As IntPtr = FindWindowEx(hSysListView32, IntPtr.Zero, "SysHeader32", Nothing)
  138.        ShowWindow(hSysHeader32, Convert.ToInt32(sH32State))
  139.    End Sub
  140.  
  141.    ''' <summary>
  142.    ''' Obtiene el identificador de WorkerW del escritorio
  143.    ''' </summary>
  144.    ''' <returns></returns>
  145.    ''' <remarks></remarks>
  146.    Public Shared Function GetHWorkerW() As IntPtr
  147.        Dim ClassNameChild As New System.Text.StringBuilder(255)
  148.        Dim hWorkerW As IntPtr
  149.        Dim hwnd As IntPtr = FindWindow(Nothing, Nothing)
  150.        Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
  151.            hwnd = GetNextWindow(hwnd, GW_Const.GW_HWNDNEXT)
  152.            hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
  153.             GetClassName(hWorkerW, ClassNameChild, 260)
  154.        Loop
  155.        Return hwnd
  156.    End Function
  157.    '//Otra forma de obtener el handle de WorkerW
  158.    ' ''' <summary>
  159.    ' ''' Obtiene el identificador de WorkerW del escritorio
  160.    ' ''' </summary>
  161.    ' ''' <returns></returns>
  162.    ' ''' <remarks></remarks>
  163.    'Public Shared Function GetHWorkerW() As IntPtr
  164.    '    Dim ClassNameChild As New System.Text.StringBuilder(255)
  165.    '    Dim hWorkerW As IntPtr
  166.    '    Dim hwnd As IntPtr = FindWindow("Progman", Nothing)
  167.    '    Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
  168.    '        hwnd = GetWindow(hwnd, GW_Const.GW_HWNDPREV)
  169.    '        hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
  170.    '        GetClassName(hWorkerW, ClassNameChild, 260)
  171.    '    Loop
  172.    '    Return hwnd
  173.    'End Function
  174. End Class


En GetHWorkerW podría devolver directamente el handle de 'SHELLDLL_DefView' y ahorrarme alguna línea. Pero lo dejo así.




52  Programación / .NET (C#, VB.NET, ASP) / VS2012, ActiveX SQL de VB6 y error APPCRASH ntdll.dll Exception Code: c0000005 en: 26 Septiembre 2016, 11:44 am
Hola. Ayer la lié parda añadiendo referencias a VB6, con motivo a una respuesta a otro usuario de este foro. Estuve añadiendo referencias ActiveX para probar códigos relacionados con bases de datos y SQL.

A partir de entonces me surge este problema navegando con IE (uso 3 navegadores) y con Visual Studio 2012

En IE me surgía este error:

Código:
APPCRASH ntdll.dll Exception Code: c0000005

y las referencias que añadí  en VB6 fueron estas:
Código:
Microsoft ActiveX Data Object (Multi-dimensional)
Microsoft ActiveX Data Object 2.0/2.1/2.5/2.6/2.8/6.0
Microsoft Active Server Pages Objext Library
Microsoft ADO Ext. 2.8 for DDL and Security
Microsoft DAO 2.5/3.51 Compatibility Library
Microsoft DAO 3.6 Object Library
Microsoft SQL Parser Object Library 1.0
Microsoft SQL Server Compact Control
Microsoft SQL Server Compact Edition Control


VS también me daba APPCRASH, y tras iniciar varias veces, tras varios errores, arrancó pero no podía iniciar proyecto de ningún tipo.

Solucioné el problema restaurando el sistema de Windows a un punto anterior. Vamos, no me compliqué la vida.

Pero me queda la duda de que es lo que ha ocurrido.

Según parece tiene algo que ver con el SQL.





53  Sistemas Operativos / Windows / Limpiar Windows manualmente en: 22 Septiembre 2016, 15:35 pm
////Eliminar un programa manualmente/////:
(porque de forma predeterminada no puedes, es decir desde AGREGAR Y QUITAR PROGRAMAS  o desde el desinstalador del programa)

Tecla Windows + R, escribe REGEDIT.EXE y pulsa ENTER

Dirígete a la clave:
Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Aquí se encuentran una serie de claves que hacen referencia a programas instalados de 32bits en sistemas de 32bits, y 64bits en sistemas de 64bits

Los programas de 32bits en sistemas de 64bits están en:
Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\


Por ejemplo si no puedes eliminar Firefox de 32bits, seleccionas la clave Uninstall, Selecciona en el menú Edición, la opción BUSCAR, desmarca "Claves"  y  "Valores" y deja marcado Datos  y pones "Mozilla". Entonces REGEDIT buscará a partir de Uninstall, claves que contengan datos con valor "Mozilla". Debería encontrar una similar a esta, según versión:
Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox 43.0.1 (x86 es-ES)

Para comprobar que el programa que queremos eliminar es el correcto pones, comprueba el valor InstallLocation que muestra el directorio donde está instalado el programa.

En el caso de Mozilla Firefox debería poner:
Código:
C:\Program Files (x86)\Mozilla Firefox
(en sistemas de 64bits con Firefox de 32bits)
Código:
C:\Program Files\Mozilla Firefox
(En sistemas de 32bits)

o también:
Código:
C:\Archivos de Programa\Mozilla Firefox

Para asegurarte más aún comprueba el valor DisplayName, muestra el nombre de la aplicación que aparece en la lista del desinstalador de programas de Windows.


Una vez estás seguro que la clave es del programa que quieres eliminar, borras la clave (por si acaso puedes exportarla a un archivo reg para poder recuperarla) y  cuando abras el desinstalador de Windows, ya no aparecerá en la lista.


Ten en cuenta que hay programas que crean varias claves. Por ejemplo Nero, crea claves para cada uno de sus componentes; Nero Vision, Nero Recode, Nero ShowTime, etc. Igualmente ocurre con Adobe Photoshop, por ejemplo.


Los programas suelen crear claves de consulta de datos o registro en el registro de Windows. Suelen estar en:

Código:
HKEY_CURRENT_USER\Software
HKEY_LOCAL_MACHINE\SOFTWARE

Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
(programas de 32bits en sistemas de 64bits)


Por ejemplo Mozilla Firefox crea esta clave:
Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla


Se pueden borrar, sin problemas, pero recuerda que es recomendable exportar las claves antes de borrar si no se estás seguro, para restaurarlas en caso de error.

Los programas suelen crear otras claves por todo el registro, pero no siempre sabemos cuales son o si el borrarlas pueden generar problemas al sistema o no. Por ello solo muestro la clave anterior.


Pero el hecho que borres las claves y no aparezca el programa en el desinstalador de programas de Windows no significa que el programa esté desinstalado, completamente. Falta borrar los archivos que suelen estar en:
Código:
C:\Program Files\
C:\Program Files (x86)\

Por ejemplo Mozilla Firefox (32bits) en un sistama de 64bits estaría en:
Código:
C:\Program Files (x86)\Mozilla Firefox

Esta carpeta se borra y ya tendrías el programa desinstalado. Sin embargo los programas pueden crear archivos de dependencia y carpetas en otros directorios como [\system32], [\Common Files], [C:\Users\Usuario\AppData\Roaming], [C:\Users\USUARIO\AppData\Local], [C:\ProgramData]. Por ejemplo Mozilla Firefox crea:

Código:
C:\Users\USUARIO\AppData\Roaming\Mozilla
C:\Users\USUARIO\AppData\Local\Mozilla


Así que si quieres hacer una desinstalación total debes eliminar también estos archivos y carpetas de dependencia, siempre y cuando esté seguro que pertenezcan con seguridad al programa que quieres eliminar o bien no sean compartidos por otro programa que los pueda necesitar.

Una forma de saber que archivos y carpetas ha creado un programa es ver el archivo
Código:
install.log
, que normalmente se encuentra en la carpeta donde está instalado el programa junto al programa de desinstalación. Este archivo muestra una lista de los archivos, carpetas y algunas claves de registro creados por el programa. Si no lo encuentras haces clic con el botón derecho sobre el acceso directo del Uninstall para ver el directorio donde se encuentra y ahí debería estar el install.log

Desgraciadamente no todos los programas tienen un
Código:
install.log
legible con el notepad, algunos usan un formato de archivos DAT u otro tipo y otro nombre. Y otros ni siquiera lo tienen.



[////Limpiar archivos temporales/////]

Tecla Windows + R, escribes
Código:
%windir%\system32\cleanmgr.exe
y pulsas ENTER
   
Esto inicia el liberador de espacio en disco de Windows.

Selecciona el directorio C:

Click en Limpiar archivos del sistema

y marcas:
[v]Archivos temporales de internet
[v]Archivos de registro de instalación
[v]Papelera de reciclaje
[v]Archivos temporales
[V]Miniaturas


Si deseas eliminar las instantáneas de restauración:
Clic en 'LImpiar archivos del sistema'
Selecciona 'Más opciones'
En 'Restaurar sistema e instantáneas' pulsa 'Liberar'


Para limpiar la carpeta Temp:
Muchos programas, generan o crean multitud de archivos temporales. Hay programas de instalación empaquetados que se desempaquetan en la carpeta temporal y ejecutan la isntalación, instalan el programa pero dejan toda la basura de instalación allí. Hay incluso Updates automáticos que generan archivos gigantescos allí, que a veces quedan corruptos o a medias y ocupan un buen cacho de disco. Por eso es recomendable de vez en cuando limpiar la carpeta temporal.

-Abre notepad y pones esto:
Código:
 FOR /D %%p IN (%temp%*.*) DO rmdir "%%p" /s /q
del /q %temp%\*.*
md  "%Temp%"

--Guarda como LimpiarCarpetaTemp.cmd
---Ejecuta  LimpiarCarpetaTemp.cmd

(Recomiendo cerrar todos los programas antes de limpiar la carpeta temporal)




54  Programación / .NET (C#, VB.NET, ASP) / Problema ocultando Form1 y liberando sus controles en: 22 Septiembre 2016, 12:06 pm
Hace tiempo que no entro aquí XD

Pero este es un problema difícil de buscar. No se ni que poner en google.

Es muy simple, cargo un formulario principal A, con X controles. Luego oculto A y libero sus controles al cargar el formulario B. Al cerrar B, se liberan los controles y eventos de B y se vuelve a mostrar el formulario A y recarga sus controles y eventos. Pero tras esto el formulario A no se cierra. Lo podría solucionar simplemente usando End. Pero no es elegante, está claro que no aplico bien el método.

Formulario 1
Código
  1. Public NotInheritable Class frmMain
  2.    Inherits Form
  3.    Friend MyButton1 As Button
  4.  
  5.    Public Sub New()
  6.  
  7.        ' Llamada necesaria para el diseñador.
  8.        MyClass.InitializeComponent()
  9.        Me.MyButton1 = New Button With {
  10.            .Text = "Show Form2",
  11.            .Location = New Point(10, 10)
  12.        }
  13.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  14.        AddHandler MyButton1.Click, AddressOf MyButton1_Click
  15.    End Sub
  16.  
  17.  
  18.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  19.        Me.Controls.Add(MyButton1)
  20.        Me.Text = "frmMain"
  21.    End Sub
  22.    Private Sub MyButton1_Click(sender As Object, e As EventArgs)
  23.        DisposeControls()
  24.        Me.Hide()
  25.        frmDialog.Show()
  26.    End Sub
  27.  
  28.    Sub DisposeControls()
  29.        Me.MyButton1.Dispose()
  30.        RemoveHandler MyButton1.Click, AddressOf MyButton1_Click
  31.    End Sub
  32.  
  33. End Class
  34.  


Formulario 2
Código
  1. Public NotInheritable Class frmDialog
  2.    Inherits Form
  3.    Friend MyButton2 As Button
  4.    Friend fmain As New frmMain
  5.    Public Sub New()
  6.        ' Llamada necesaria para el diseñador.
  7.        MyClass.InitializeComponent()
  8.        MyButton2 = New Button With
  9.        {
  10.            .Text = "Show Form1",
  11.            .Location = New Point(10, 10)
  12.        }
  13.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  14.        AddHandler MyButton2.Click, AddressOf MyButton2_Click
  15.    End Sub
  16.  
  17.    Private Sub frmDialog_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
  18.        fmain.Show()
  19.        ' fmain.Visible=tue
  20.  
  21.    End Sub
  22.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  23.        Me.Controls.Add(MyButton2)
  24.        Me.Text = "frmDialog"
  25.    End Sub
  26.    Private Sub MyButton2_Click(sender As Object, e As EventArgs)
  27.        DisposeControls()
  28.        Me.Close()
  29.    End Sub
  30.    Sub DisposeControls()
  31.  
  32.        RemoveHandler MyButton2.Click, AddressOf MyButton2_Click
  33.        Me.MyButton2.Dispose()
  34.    End Sub
  35. End Class

He probado de todo.



gracias por la ayuda



Si no libero los controles y eventos creados en el formulario A, entonces va bien. Pero deberían poderse liberar.


Código
  1. Public NotInheritable Class frmMain
  2.    Inherits Form
  3.    Friend MyButton1 As Button
  4.  
  5.    Public Sub New()
  6.  
  7.        ' Llamada necesaria para el diseñador.
  8.        MyClass.InitializeComponent()
  9.        Me.MyButton1 = New Button With {
  10.            .Text = "Show Form2",
  11.            .Location = New Point(10, 10)
  12.        }
  13.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  14.        AddHandler MyButton1.Click, AddressOf MyButton1_Click
  15.    End Sub
  16.  
  17.  
  18.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  19.        Me.Controls.Add(MyButton1)
  20.        Me.Text = "frmMain"
  21.    End Sub
  22.    Private Sub MyButton1_Click(sender As Object, e As EventArgs)
  23.        DisposeControls()
  24.        Me.Hide()
  25.        frmDialog.Show()
  26.    End Sub
  27.  
  28.    Sub DisposeControls()
  29.        Me.MyButton1.Dispose()
  30.        RemoveHandler MyButton1.Click, AddressOf MyButton1_Click
  31.    End Sub
  32.  
  33. End Class


Código
  1. Public NotInheritable Class frmDialog
  2.    Inherits Form
  3.    Friend MyButton2 As Button
  4.    Public Sub New()
  5.        ' Llamada necesaria para el diseñador.
  6.        MyClass.InitializeComponent()
  7.        MyButton2 = New Button With
  8.        {
  9.            .Text = "Show Form1",
  10.            .Location = New Point(10, 10)
  11.        }
  12.        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
  13.        AddHandler MyButton2.Click, AddressOf MyButton2_Click
  14.    End Sub
  15.  
  16.    Private Sub frmDialog_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
  17.        '  fmain.Show()
  18.        frmMain.Show()
  19.  
  20.    End Sub
  21.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  22.        Me.Controls.Add(MyButton2)
  23.        Me.Text = "frmDialog"
  24.    End Sub
  25.    Private Sub MyButton2_Click(sender As Object, e As EventArgs)
  26.        'DisposeControls()
  27.        Me.Close()
  28.    End Sub
  29.    Sub DisposeControls()
  30.  
  31.        RemoveHandler MyButton2.Click, AddressOf MyButton2_Click
  32.        Me.MyButton2.Dispose()
  33.    End Sub
  34. End Class
55  Foros Generales / Dudas Generales / Sitio para colgar fotos en: 19 Septiembre 2016, 11:33 am
Hola buenas. Me pueden decir sitios para colgar fotos gratuitamente, para luego poder compartirlas con un link. ¿Cuál me recomiendan?


Supongo esta pregunta se habrá hecho muchas veces pero en el buscador encontraba como subir a este foro no como colgarlas en alguna parte.

Gracias


ups, encontré en google.

http://fotografia.about.com/od/Impresion_publicacion/tp/10-Sitios-Para-Publicar-Primera-Parte.htm
56  Foros Generales / Foro Libre / USB Killer ¿Qué opinas? en: 18 Septiembre 2016, 21:52 pm
Ha salido al mercado un pendrive que acumula energía y luego la devuelve de golpe al equipo destruyendo el equipo.




Los creadores lo vendían a fabricantes pero tras su fracaso decidieron venderlo a usuarios y lo justifican diciendo que está orientado a mejorar la seguridad.
Qué tomadura de pelo, ¿Quién va a probarlo en su equipo?


No creo que quien compre esos USB sea para probar seguridad de equipos.

Esto es como las armas de fuego. Venden armas para los servicios de seguridad, pero los malos también las usan...

Quien va a usar algo  que solo conectarlo al equipo en segundos te lo cargas. En fin, no se, ¿Qué opinas? ¿Para qué lo usarías tú?


57  Sistemas Operativos / Windows / No se escucha el altavoz interno del PC desde Windows en: 13 Septiembre 2016, 12:56 pm
hola
Tengo un PC con Windows 10 y no escucho el altavoz interno del PC. Windows reproduce a través de altavoces externos.



El servicio Beep está iniciado.
Desde Adminstrador de dispositivos el Plug and Play Beep está activo y lo inicia el sistema.
Cuando el PC arranca se escucha un Beep, luego el altavoz funciona.
Desde Linux si que funciona

He creado un programa que genera beeps de forma automática y veo los pulsos del sonido pero no se escucha nada.

Parece que Windows desvía el sonido a los externos, aunque no tenga ninguno conectado.

gracias por la ayuda

58  Foros Generales / Dudas Generales / icono suspender en: 31 Agosto 2016, 15:06 pm
hola, ¿Qué icono definiría mejor el concepto de suspender?

Tengo varios-
-apagar con puntos suspensivos debajo
-dos barritas dentro un círculo (II) = pausa
- un reloj...

no se es que no me convence ninguno  :(

Usaré  (II)
59  Foros Generales / Dudas Generales / Se ejecuta FlashUtil64_22_0_0_210_ActiveX.exe cuando entro en elhacker en: 26 Agosto 2016, 16:53 pm
qtal, bueno pues resulta que se me ejecuta FlashUtil64_22_0_0_210_ActiveX.exe

que se encuentra en:
Código:
C:\Windows\System32\Macromed\Flash

cuando entro en elhacker.net ¿por qué?

Lo curioso es que me sale un mensaje de confirmación si deseo ejectuarlo o no y aunque responda "no permitir". Se ejecuta igual.

nada solo esta duda, de porqué ocurre, nada más, de momento lo he cambiado el nombre "FlashUtil64_22_0_0_210_ActiveX.exe.bak" para que no se ejecute.   :¬¬


por cierto me he equivocado quería preguntar en dudas generales. sorry

60  Sistemas Operativos / Windows / Duda con Windows 7 pirata en: 25 Agosto 2016, 19:33 pm
qu tal

Me he bajado un Windows 7 pirata. La razón es que necesito comprobar una cosa con la versión Windows7 starter, pero eso no viene cuento.

Ya para empezar había un troyano detectable en el disco. que he eliminado, claro

Desde VirtualBox, inicio la instalación y  aparece un cuadro en el que puedes elegir todas las versiones de W7. Digo, bueno vale, pues para adelante y elijo W7 starter.

Cuando entro en el administrador de discos de la instalación elimino todas las particiones( porque he usado un disco virtual ya usado para otro sistema)-

Creo una nueva y sorpresa, la partición reservada que se crea ocupa nada menos que 350MB cuando deberían ser 100MB, ¿Esto es normal?.
¿no será que el buen samaritano que ha compartido el W7 este ha modificado para meter ahí algún regalo?

No se

Gracias por la ayda.


Añado que tengo el Enterprise y el Ultimate y ambos me crean 100mb. Sin embargo este crea 350 incluso cuando selecciono el Ultimate en la lista. :-\

Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines