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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Cambiar vistas de iconos del escritorio en Windows
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar vistas de iconos del escritorio en Windows  (Leído 3,370 veces)
okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
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í.






« Última modificación: 6 Octubre 2016, 18:11 pm por okik » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Cambiar vistas de iconos del escritorio en Windows
« Respuesta #1 en: 5 Octubre 2016, 08:36 am »

Buen aporte, siempre me han gustado este tipo de snippets que nunca se sabe cuando se podrán necesitar y cuando menos te lo esperas lo necesitas usar por el motivo que ses, jeje



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

Sería mucho más facil intentar proporcionarte ayuda si en la documentación Xml hubieses incluido la url de MSDN (o el archivo de cabeceras de C++) de donde sacaste los valores de la enumeración "viewOptIcon", o si lo hubieses especificado al describir el problema...

Dicho esto, sin haber podido leer la documentación y anotaciones de Microsoft o haber podido analizar la fuente que sea de donde sacaste esos valores, entonces solo puedo decirte que podrías probar a notificarle el cambio de vista de iconos al sistema operativo utilizando la función SendMessageTimeout

Código
  1. ''' <remarks>
  2. ''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644952%28v=vs.85%29.aspx"/>
  3. ''' </remarks>
  4. <DllImport("User32.dll", SetLastError:=True)>
  5. Friend Shared Function SendMessageTimeout(ByVal hwnd As IntPtr,
  6.                                          ByVal msg As WindowsMessages,
  7.                                          ByVal wParam As IntPtr,
  8.                                          ByVal lParam As IntPtr,
  9.                                          ByVal flags As SendMessageTimeoutFlags,
  10.                                          ByVal timeout As Integer,
  11.                                    <Out> ByRef refResult As IntPtr
  12. ) As IntPtr
  13. End Function
  14. ' Overloads y documentación adicional:
  15. ' https://github.com/ElektroStudios/ElektroKit/blob/12f1ff734193945286b00b3abf605a1b89fea648/Solution/Elektro.Interop/Win32/NativeMethods/NativeMethods_User32.vb
  16.  
  17. ''' <remarks>
  18. ''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644952%28v=vs.85%29.aspx"/>
  19. ''' </remarks>
  20. <Flags>
  21. Friend Enum SendMessageTimeoutFlags As Integer
  22.    Normal = &H0
  23.    Block = &H1
  24.    AbortIfHung = &H2
  25.    NoTimeoutIfNotHung = &H8
  26.    ErrorOnExit = &H20
  27. End Enum
  28. ' Documentación adicional:
  29. ' https://github.com/ElektroStudios/ElektroKit/blob/12f1ff734193945286b00b3abf605a1b89fea648/Solution/Elektro.Interop/Win32/Enums/SendMessageTimeoutFlags.vb
  30.  
  31. Friend Enum WindowsMessages As Integer
  32.  
  33.    ''' <remarks>
  34.    ''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms644952%28v=vs.85%29.aspx"/>
  35.    ''' </remarks>
  36.    HWND_Broadcast = &HFFFF
  37.  
  38.    ''' <remarks>
  39.    ''' <see href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms725497%28v=vs.85%29.aspx"/>
  40.    ''' </remarks>
  41.    WM_SettingChange = &H1A
  42.  
  43. End Enum
  44. ' Mensajes de ventana adicionales y documentación adicional:
  45. ' https://github.com/ElektroStudios/ElektroKit/blob/12f1ff734193945286b00b3abf605a1b89fea648/Solution/Elektro.Interop/Win32/Enums/WindowsMessages.vb

Modo de empleo:
Código
  1. Public Shared Sub ViewModeIconDesktop(...)
  2.    ...
  3.    SendMessage(...)
  4.    NativeMethods.SendMessageTimeout(New IntPtr(WindowsMessages.HWND_Broadcast), WindowsMessages.WM_Settingchange, IntPtr.Zero, IntPtr.Zero,
  5.                                     SendMessageTimeoutFlags.AbortIfHung, 100, IntPtr.Zero)
  6. End Sub

El mensaje de ventana WM_SETTINGCHANGE sirve para notificar a una ventana de un cambio en los valores del sistema (también puedes especificar el nombre específico de la clave de registro en el parámetro lParam), y al especificar la constante HWND_BROADCAST se envia la notificación a todas las ventanas principales activas en el sistema... conviene enviarlo a todas las ventanas cuando se trata de un cambio que afecte al escritorio.

No lo he probado con tu código, pero esta metodología siempre me ha funcionado para actualizar el sistema al realizar una gran mayoría de cambios que de otra manera no se verían reflejados al instante o se revertirían al reiniciar sesión de usuario, aunque te advierto que no funciona con todos los tipos de cambios.

Saludos!


« Última modificación: 5 Octubre 2016, 08:50 am por Eleкtro » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Cambiar vistas de iconos del escritorio en Windows
« Respuesta #2 en: 5 Octubre 2016, 15:23 pm »

Sería mucho más facil intentar proporcionarte ayuda si en la documentación Xml hubieses incluido la url de MSDN (o el archivo de cabeceras de C++) de donde sacaste los valores de la enumeración "viewOptIcon", o si lo hubieses especificado al describir el problema...

Respecto a viewOptIcon no hay documentación, al menos que yo sepa. Lo obtuve a la cuenta de la vieja.

Haces esto


Código
  1.    Public Shared Sub ViewModeIconDesktop(ByVal intValueView As Integer)
  2.        Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
  3.        Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  4.        SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
  5.    End Sub

y luego desde un botón:
Código:
num+=1
Dim newValue As Integer= 28700 + num
ViewModeIconDesktop (newValue )
Me.text = CStr(newValue)

Ahí le vas dando al botón esperando algún resultado jeje. Te saldrán incluso cuadros de diálogo, o se te seleccionarán todos los iconos de golpe.

Al usar este método con Progman puede producirse un resultado inesperado, sobre todo si es diréctamente a Progman y no a  SHELLDLL_DefView. Si pruebas con SHELLDLL_DefView creo recordar que hay un valor que cierra explorer y lo vuelve a abrir pero se cerrará todo lo que estabas trabajando. El equivalente a cerrar sesión pero de golpe. Creo que era con este código pero no estoy seguro. Así que ojo con eso.

También recuerdo que usando este método con Progman u otra ventana de windows se me produjo un cambio que luego no  supe como restaurarlo. Así que es más seguro usarlo en una máquina virtual por ejemplo.

En cuanto a usar
Código:
SendMessageTimeOut
he probado pero tras cerrar sesión sigue mostrandose igual. No se qué valor darle WM_SettingChange o si me dices que tengo que cambiarlo.

Este código ya lo tenía y lo usaba para actualizar los iconos.  Pero no lo usaba así, no se si será correcto como lo tenía. Era con todos los valores Integer:

Código
  1.    <DllImport("User32.dll", SetLastError:=True)>
  2.    Friend Shared Function SendMessageTimeout(ByVal hwnd As Integer,
  3.                                         ByVal msg As Integer,
  4.                                         ByVal wParam As Integer,
  5.                                        ByVal lParam As Integer,
  6.                                         ByVal flags As Integer,
  7.                                          ByVal timeout As Integer,
  8.                                   <Out> ByRef refResult As Integer
  9. ) As IntPtr
  10.    End Function
  11.    Private Const WM_SETTINGCHANGE = &H1A
  12.    Private Const HWND_BROADCAST = &HFFFF&
  13.    Private Const SPI_SETNONCLIENTMETRICS = 42
  14.    Private Const SMTO_ABORTIFHUNG = &H2
  15.    Public Shared Sub RefreshWindows()
  16.        SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, &H0, SMTO_ABORTIFHUNG, &H100, &H0)
  17.    End Sub


Como he dicho este código solo refresca el aspecto gráfico, como lo iconos. Si por ejemplo, en el registro de windows cambio el icono asociado de una extensión, y ejecuto este código, el icono se actualiza al que he cambiado.

Otra forma que encontré también usando el método anterior fue este. Hace lo mismo tanto con el escritorio como con explorer.exe:
Código
  1.        Const WM_USER = &H400
  2.        Dim hProgman As IntPtr = FindWindow("Progman", "Program Manager")
  3.        'SendMessage(hProgman, &H460, &H0, WM_USER)
  4.        SendMessage(hProgman, &H45A, &H0, WM_USER)
  5.  


Pero si establezco mostrar todos los archivos ocultos aunque refresque no se verán, ni con tu forma de implementarlo ¿debo cambiar el WM_SettingChange según lo que quiera actualizar?:

Este cambio en el registro mostraría los archivos ocultos...
Código:
[HKEY_USERS\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"Hidden"=dword:000001

[HKEY_USERS\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"ShowSuperHidden"=dword:000001

Para refrescar de modo que se apliquen ajustes del registro, como mostrar/ocultar archivos ocultos, de windows sin necesidad de reiniciar  y usuando el método que expliqué antes,  encontré esta forma:
Código
  1.    Const WM_COMMAND = &H111
  2.    Const WP_REFRESH_DESKTOP = &H7103
  3.    Const WP_REFRESH_CABINET = &HA220
  4.    Const WP_REFRESH_EXPLORER = &H7FEF
  5.  
  6.       'Refrescar Escritorio
  7.        Dim hProgMan As IntPtr
  8.        Dim hDefView As IntPtr
  9.        hProgMan = FindWindow("Progman", "Program Manager")
  10.        hDefView = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  11.        SendMessage(hDefView, WM_COMMAND, WP_REFRESH_DESKTOP, &H0)
  12.  
  13.        'Refrescar Explorer
  14.        Dim hCabinetWClass As IntPtr
  15.        hCabinetWClass = FindWindow("CabinetWClass", vbNullString)
  16.        SendMessage(hCabinetWClass, WM_COMMAND, WP_REFRESH_CABINET, &H0)
  17.  
  18.        'Refrescar explorer Windows XP
  19.        'Dim hExploreWClass As IntPtr
  20.        ' hExploreWClass = FindWindow("ExploreWClass", vbNullString)
  21.        'SendMessage hExploreWClass, WM_COMMAND, WP_REFRESH_EXPLORER, &H0
  22.  
  23.  
Tengo que enviar los mensajes por separado uno a Progman (Escritorio) y otro a CabinetWClass (Explorer.exe).

Entonces para refrescar windows al completo, personalmente yo uso este método, y  ahora cambio mi "SendMessageTimeOut" por el modo que lo has puesto tú. Está mejor.

Código
  1. <System.Security.SuppressUnmanagedCodeSecurity()>
  2. Friend NotInheritable Class NativeMethods
  3.    Inherits Attribute
  4.    Private Sub New()
  5.    End Sub
  6.    <DllImport("User32.dll", SetLastError:=True)>
  7.    Friend Shared Function SendMessageTimeout(ByVal hwnd As Integer,
  8.                                         ByVal msg As Integer,
  9.                                         ByVal wParam As Integer,
  10.                                        ByVal lParam As Integer,
  11.                                         ByVal flags As Integer,
  12.                                          ByVal timeout As Integer,
  13.                                   <Out> ByRef refResult As Integer
  14. ) As IntPtr
  15.    End Function
  16.    <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
  17.    Private Shared Function FindWindowEx(
  18.                                        ByVal hWnd1 As IntPtr,
  19.                                        ByVal hWnd2 As IntPtr,
  20.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
  21.                                        <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr
  22.  
  23.    End Function
  24.    <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
  25.    Private Shared Function FindWindow(
  26.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
  27.                                      <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
  28.    End Function
  29.    <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
  30.    Private Shared Function SendMessage(ByVal hwnd As IntPtr,
  31.                                        ByVal wMsg As Integer,
  32.                                        ByVal wParam As Integer,
  33.                                        lParam As Integer) As Boolean
  34.    End Function
  35.  
  36.    <DllImport("User32.dll", SetLastError:=True)>
  37.    Friend Shared Function SendMessageTimeout(ByVal hwnd As IntPtr,
  38.                                         ByVal msg As WindowsMessages,
  39.                                         ByVal wParam As IntPtr,
  40.                                        ByVal lParam As IntPtr,
  41.                                         ByVal flags As SendMessageTimeoutFlags,
  42.                                          ByVal timeout As Integer,
  43.                                   <Out> ByRef refResult As IntPtr
  44. ) As IntPtr
  45.    End Function
  46.    Friend Enum SendMessageTimeoutFlags As Integer
  47.        Normal = &H0
  48.        Block = &H1
  49.        AbortIfHung = &H2
  50.        NoTimeoutIfNotHung = &H8
  51.        ErrorOnExit = &H20
  52.    End Enum
  53.    Friend Enum WindowsMessages As Integer
  54.        HWND_Broadcast = &HFFFF
  55.        WM_SettingChange = &H1A
  56.    End Enum
  57.  
  58.    Const WM_COMMAND = &H111
  59.    Const WP_REFRESH_DESKTOP = &H7103
  60.    Const WP_REFRESH_CABINET = &HA220
  61.    Const WP_REFRESH_EXPLORER = &H7FEF
  62.  
  63.    Public Shared Sub RefreshWindows()
  64.  
  65.        'Refrescar escritorio
  66.        Dim hProgMan As IntPtr
  67.        Dim hDefView As IntPtr
  68.        hProgMan = FindWindow("Progman", "Program Manager")
  69.        hDefView = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
  70.        SendMessage(hDefView, WM_COMMAND, WP_REFRESH_DESKTOP, &H0)
  71.  
  72.        'Refrescar Explorer
  73.        Dim hCabinetWClass As IntPtr
  74.        hCabinetWClass = FindWindow("CabinetWClass", vbNullString)
  75.        SendMessage(hCabinetWClass, WM_COMMAND, WP_REFRESH_CABINET, &H0)
  76.  
  77.        'Refrescar Explorer (Windows XP)
  78.        'Dim hExploreWClass As IntPtr
  79.        'hExploreWClass = FindWindow("ExploreWClass", vbNullString)
  80.        'SendMessage hExploreWClass, WM_COMMAND, WP_REFRESH_EXPLORER, &H0
  81.  
  82.  
  83.        'Refrescar los iconos
  84.        SendMessageTimeout(New IntPtr(WindowsMessages.HWND_Broadcast), WindowsMessages.WM_SettingChange, IntPtr.Zero, IntPtr.Zero,
  85.   SendMessageTimeoutFlags.AbortIfHung, 100, IntPtr.Zero)
  86.    End Sub
  87. End Class
  88.  

Esto lo hace actualiza en general sea cual sea el cambio que se haga en el registro.
« Última modificación: 5 Octubre 2016, 15:42 pm por okik » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Cambiar vistas de iconos del escritorio en Windows
« Respuesta #3 en: 7 Octubre 2016, 11:02 am »

Hola

Vaya como se ha animado este foro, ya no quería entrar pero es que esta especie de hacks me encantan.

He probado el código y me ha salido una barra scroll en el lateral derecho que no se quita. ¿como lo puedo quitar? es que cambio a iconos normales, los pongo pequeños y la barra sigue ahí y ahora no la puedo quitar. No quiero tener que restaurar windows.

No estaría mal que aplicaran el modo lista deslizable en el escritorio  en próximas versiones de Windows. Así puedes tener cientos de iconos ordenados por nombre y ocupan solo el lateral izquierdo del escritorio. Está genial.

S2s



He cerrado sesión y se ha quitado. Pero el caso es que se mantiene el scroll aunque cambie a icono una vez lo pones en detalle. El scroll no se va a no ser que cierre sesión o mate el  Explore.exe y lo vuelva a  abrir.

« Última modificación: 7 Octubre 2016, 12:32 pm por Lekim » En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Cambiar vistas de iconos del escritorio en Windows
« Respuesta #4 en: 8 Octubre 2016, 12:31 pm »

Hola

Vaya como se ha animado este foro, ya no quería entrar pero es que esta especie de hacks me encantan.

He probado el código y me ha salido una barra scroll en el lateral derecho que no se quita. ¿como lo puedo quitar? es que cambio a iconos normales, los pongo pequeños y la barra sigue ahí y ahora no la puedo quitar. No quiero tener que restaurar windows.

No estaría mal que aplicaran el modo lista deslizable en el escritorio  en próximas versiones de Windows. Así puedes tener cientos de iconos ordenados por nombre y ocupan solo el lateral izquierdo del escritorio. Está genial.

S2s



He cerrado sesión y se ha quitado. Pero el caso es que se mantiene el scroll aunque cambie a icono una vez lo pones en detalle. El scroll no se va a no ser que cierre sesión o mate el  Explore.exe y lo vuelva a  abrir.



hola, pues no se que puede ser que no se vaya el scrollbar, a mi no me pasa (con eso no quiero decir que estés mintiendo). En un principio pensé que podía ser cuando se aplica bajo WorkerW pero no.

De todos modos el investigar me has servido para saber porqué se mostraba SHELLDLL_DefView como ventana hijo  de WorkerW en un ordenador y en otro no. La razón es que cuando accedes a personalización y cambias el tema de windows de tipo Aero, SHELLDLL_DefView que por defecto está bajo Progman pasa a WorkerW. Si matas explorer.exe y lo vuelves a ejecutar SHELLDLL_DefView  volverá a estar bajo Progman.

Si no lo hubieras solucionado te hubiera mostrado un código para quitar la barra. Que yo sepa no tiene identificador, pero se podía quitar usando GetWindowLong, SetWindowLong y SetWindowPos.



« Última modificación: 8 Octubre 2016, 13:13 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
vistas miniatura en vez de iconos
Windows
maxmag 4 4,757 Último mensaje 20 Diciembre 2011, 07:23 am
por Eleкtro
[Windows XP] Iconos del escritorio se desplazan
Windows
antoniokratos 2 4,374 Último mensaje 23 Febrero 2012, 22:57 pm
por antoniokratos
Problemas con iconos en escritorio windows 7
Windows
jovobolson 2 3,274 Último mensaje 19 Diciembre 2013, 17:17 pm
por andavid
MOVIDO: Problemas con iconos en escritorio windows 7
Dudas Generales
Songoku 0 1,543 Último mensaje 12 Diciembre 2013, 14:34 pm
por Songoku
[Pack iconos Windows 10] Cambiar iconos de Windows (Tutorial)
Windows
DeMoNcRaZy 3 19,257 Último mensaje 8 Septiembre 2015, 12:59 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines