Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - okik

#461
.NET (C#, VB.NET, ASP) / Re: cifrar Carpetas
5 Octubre 2016, 19:43 PM
Cita de: Tomas1982 en  5 Octubre 2016, 18:56 PM
El código esta muy bueno, pero cuando trato de proteger la carpeta ubicada en una memoria, no me funciona...  

Ejecuta como administrador

Imagino que lo sabes pero por si acaso te lo comento.

Para hacer que el programa se ejecute como administrador por defecto. Vas a propiedades del proyecto y clicas en Ver configuración de Windows.

se te abrirá el App.manifest y verás un código XML:
Donde pone
Código (xml) [Seleccionar]
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

quitas asInvoker y pones requireAdministrator

te quedará así:
Código (xml) [Seleccionar]
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Guarda y cuando inicies el programa dentro del entorno de programación (f5) Visual studio te preguntará si deseas reiniciar con nuevas credenciales, le dices que sí.  y ahora VS iniciará el programa como administrador, además que el programa quedará compilado con el nuevo manifiesto y cuando lo inicies se iniciará con privilegios de administrador.

Ahora aunque la carpeta esté abierta se podrá cambiar el atributo.





#462
.NET (C#, VB.NET, ASP) / Re: cifrar Carpetas
5 Octubre 2016, 15:43 PM
Cita de: MCKSys Argentina en  5 Octubre 2016, 14:17 PM
Seguro que haz buscado bien? Porque me sale ésto en el 3er resultado de Google How to encrypt and decrypt a file by using Visual C#

Saludos!

PD: Mi búsqueda.

Eso es para archivos no para carpetas... si no me equivoco



Ahora lo miro a ver...  :P




Pues lo que decía ese código es para cifrar el contenido de un archivo.

Código (vbnet) [Seleccionar]
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form1

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       ' Must be 64 bits, 8 bytes.
       ' Distribute this key to the user who will decrypt this file.
       Dim sSecretKey As String
       sSecretKey = CSEncryptDecrypt.Class1.GenerateKey() ' Get the Key for the file to Encrypt.
       Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)                       ' For additional security Pin the key.
       CSEncryptDecrypt.Class1.EncryptFile("C:\Prueba\Texto.txt", "C:\Prueba\TextoEncrypt.txt", sSecretKey)        ' Encrypt the file.        
       CSEncryptDecrypt.Class1.ZeroMemory(gch.AddrOfPinnedObject(), CType(sSecretKey.Length * 2, IntPtr))
       gch.Free()
   End Sub

   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
       ' Must be 64 bits, 8 bytes.
       ' Distribute this key to the user who will decrypt this file.
       Dim sSecretKey As String
       sSecretKey = CSEncryptDecrypt.Class1.GenerateKey() ' Get the Key for the file to Encrypt.
       Dim gch As GCHandle = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned)
       CSEncryptDecrypt.Class1.DecryptFile("C:\Prueba\TextoEncrypt.txt", "C:\Prueba\Decrypt.txt", sSecretKey)    ' Decrypt the file.
       CSEncryptDecrypt.Class1.ZeroMemory(gch.AddrOfPinnedObject(), CType(sSecretKey.Length * 2, IntPtr)) ' Remove the Key from memory.
       gch.Free()
   End Sub
End Class


Namespace CSEncryptDecrypt

   Class Class1
       <DllImport("kernel32.dll")> _
       Public Shared Sub ZeroMemory(ByVal addr As IntPtr, ByVal size As IntPtr)
       End Sub
       '  Call this function to remove the key from memory after use for security
       '<System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint:="RtlZeroMemory")> _
       'Public Shared Function ZeroMemory(Destination As IntPtr, Length As Integer) As Boolean
       'End Function

       ' Function to Generate a 64 bits Key.
       Public Shared Function GenerateKey() As String
           ' Create an instance of Symetric Algorithm. Key and IV is generated automatically.
           Dim desCrypto As DESCryptoServiceProvider = DirectCast(DESCryptoServiceProvider.Create(), DESCryptoServiceProvider)

           ' Use the Automatically generated key for Encryption.
           Return ASCIIEncoding.ASCII.GetString(desCrypto.Key)
       End Function

       Public Shared Sub EncryptFile(sInputFilename As String, sOutputFilename As String, sKey As String)
           Dim fsInput As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)

           Dim fsEncrypted As New FileStream(sOutputFilename, FileMode.Create, FileAccess.Write)
           Dim DES As New DESCryptoServiceProvider()
           DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
           DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
           Dim desencrypt As ICryptoTransform = DES.CreateEncryptor()
           Dim cryptostream As New CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write)

           Dim bytearrayinput As Byte() = New Byte(CInt(fsInput.Length - 1)) {}
           fsInput.Read(bytearrayinput, 0, bytearrayinput.Length)
           cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length)
           cryptostream.Close()
           fsInput.Close()
           fsEncrypted.Close()
       End Sub

       Public Shared Sub DecryptFile(sInputFilename As String, sOutputFilename As String, sKey As String)
           Dim DES As New DESCryptoServiceProvider()
           'A 64 bit key and IV is required for this provider.
           'Set secret key For DES algorithm.
           DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
           'Set initialization vector.
           DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

           'Create a file stream to read the encrypted file back.
           Dim fsread As New FileStream(sInputFilename, FileMode.Open, FileAccess.Read)
           'Create a DES decryptor from the DES instance.
           Dim desdecrypt As ICryptoTransform = DES.CreateDecryptor()
           'Create crypto stream set to read and do a
           'DES decryption transform on incoming bytes.
           Dim cryptostreamDecr As New CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read)
           'Print the contents of the decrypted file.
           Dim fsDecrypted As New StreamWriter(sOutputFilename)
           fsDecrypted.Write(New StreamReader(cryptostreamDecr).ReadToEnd())
           fsDecrypted.Flush()
           fsDecrypted.Close()
       End Sub


   End Class
End Namespace




Encontré este código lo he testado y funciona:
Código (vbnet) [Seleccionar]
Imports System.Security.AccessControl
Imports System.IO


Public Class Form1

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim FolderBrowserDialog1 As New FolderBrowserDialog
       With FolderBrowserDialog1
           If .ShowDialog() = DialogResult.OK Then
               TextBox1.Text = .SelectedPath
           End If
       End With

   End Sub

   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
       Dim fs As FileSystemSecurity = File.GetAccessControl(TextBox1.Text)
       fs.AddAccessRule(New FileSystemAccessRule(Environment.UserName, FileSystemRights.FullControl, AccessControlType.Deny))
       File.SetAccessControl(TextBox1.Text, CType(fs, FileSecurity))
   End Sub

   Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
       Dim fs As FileSystemSecurity = File.GetAccessControl(TextBox1.Text)
       fs.RemoveAccessRule(New FileSystemAccessRule(Environment.UserName, FileSystemRights.FullControl, AccessControlType.Deny))
       File.SetAccessControl(TextBox1.Text, CType(fs, FileSecurity))
   End Sub
End Class


FUENTE:
http://burnignorance.com/vb-net-tricks/how-to-lock-and-unlock-a-folder-through-code-in-vb-net/

Esto bloquea el acceso a la carpeta. Lo que no se es si será accesible desde un Linxu Live por ejemplo o algún programa de arranque, o quizás desde el modo seguro.





Lo se la contraseña se me ocurre que la metas cifrada, con el código de arriba por ejemplo dentro de la misma carpeta, desde el programa cuando se quiera desbloquear, el programa desbloquearía la carpeta el tiempo justo para poder acceder a la contraseña descifrarla y compararla con la que introduce el usuario. Se ve un poco, chapuza pero es lo que se me ocurre ahora. Podrías mirarte en ingeniería inversa, a ver.



#463
Cita de: Eleкtro en  5 Octubre 2016, 08:36 AM
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 (vbnet) [Seleccionar]

   Public Shared Sub ViewModeIconDesktop(ByVal intValueView As Integer)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
   End Sub


y luego desde un botón:

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 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 (vbnet) [Seleccionar]

   <DllImport("User32.dll", SetLastError:=True)>
   Friend Shared Function SendMessageTimeout(ByVal hwnd As Integer,
                                        ByVal msg As Integer,
                                        ByVal wParam As Integer,
                                       ByVal lParam As Integer,
                                        ByVal flags As Integer,
                                         ByVal timeout As Integer,
                                  <Out> ByRef refResult As Integer
) As IntPtr
   End Function
   Private Const WM_SETTINGCHANGE = &H1A
   Private Const HWND_BROADCAST = &HFFFF&
   Private Const SPI_SETNONCLIENTMETRICS = 42
   Private Const SMTO_ABORTIFHUNG = &H2
   Public Shared Sub RefreshWindows()
       SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, &H0, SMTO_ABORTIFHUNG, &H100, &H0)
   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 (vbnet) [Seleccionar]

       Const WM_USER = &H400
       Dim hProgman As IntPtr = FindWindow("Progman", "Program Manager")
       'SendMessage(hProgman, &H460, &H0, WM_USER)
       SendMessage(hProgman, &H45A, &H0, WM_USER)



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...

[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 (vbnet) [Seleccionar]

   Const WM_COMMAND = &H111
   Const WP_REFRESH_DESKTOP = &H7103
   Const WP_REFRESH_CABINET = &HA220
   Const WP_REFRESH_EXPLORER = &H7FEF

      'Refrescar Escritorio
       Dim hProgMan As IntPtr
       Dim hDefView As IntPtr
       hProgMan = FindWindow("Progman", "Program Manager")
       hDefView = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       SendMessage(hDefView, WM_COMMAND, WP_REFRESH_DESKTOP, &H0)

       'Refrescar Explorer
       Dim hCabinetWClass As IntPtr
       hCabinetWClass = FindWindow("CabinetWClass", vbNullString)
       SendMessage(hCabinetWClass, WM_COMMAND, WP_REFRESH_CABINET, &H0)

       'Refrescar explorer Windows XP
       'Dim hExploreWClass As IntPtr
       ' hExploreWClass = FindWindow("ExploreWClass", vbNullString)
       'SendMessage hExploreWClass, WM_COMMAND, WP_REFRESH_EXPLORER, &H0


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 (vbnet) [Seleccionar]

<System.Security.SuppressUnmanagedCodeSecurity()>
Friend NotInheritable Class NativeMethods
   Inherits Attribute
   Private Sub New()
   End Sub
   <DllImport("User32.dll", SetLastError:=True)>
   Friend Shared Function SendMessageTimeout(ByVal hwnd As Integer,
                                        ByVal msg As Integer,
                                        ByVal wParam As Integer,
                                       ByVal lParam As Integer,
                                        ByVal flags As Integer,
                                         ByVal timeout As Integer,
                                  <Out> ByRef refResult As Integer
) As IntPtr
   End Function
   <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
   Private Shared Function FindWindowEx(
                                       ByVal hWnd1 As IntPtr,
                                       ByVal hWnd2 As IntPtr,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr

   End Function
   <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
   Private Shared Function FindWindow(
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
   End Function
   <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
   Private Shared Function SendMessage(ByVal hwnd As IntPtr,
                                       ByVal wMsg As Integer,
                                       ByVal wParam As Integer,
                                       lParam As Integer) As Boolean
   End Function

   <DllImport("User32.dll", SetLastError:=True)>
   Friend Shared Function SendMessageTimeout(ByVal hwnd As IntPtr,
                                        ByVal msg As WindowsMessages,
                                        ByVal wParam As IntPtr,
                                       ByVal lParam As IntPtr,
                                        ByVal flags As SendMessageTimeoutFlags,
                                         ByVal timeout As Integer,
                                  <Out> ByRef refResult As IntPtr
) As IntPtr
   End Function
   Friend Enum SendMessageTimeoutFlags As Integer
       Normal = &H0
       Block = &H1
       AbortIfHung = &H2
       NoTimeoutIfNotHung = &H8
       ErrorOnExit = &H20
   End Enum
   Friend Enum WindowsMessages As Integer
       HWND_Broadcast = &HFFFF
       WM_SettingChange = &H1A
   End Enum

   Const WM_COMMAND = &H111
   Const WP_REFRESH_DESKTOP = &H7103
   Const WP_REFRESH_CABINET = &HA220
   Const WP_REFRESH_EXPLORER = &H7FEF

   Public Shared Sub RefreshWindows()

       'Refrescar escritorio
       Dim hProgMan As IntPtr
       Dim hDefView As IntPtr
       hProgMan = FindWindow("Progman", "Program Manager")
       hDefView = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       SendMessage(hDefView, WM_COMMAND, WP_REFRESH_DESKTOP, &H0)

       'Refrescar Explorer
       Dim hCabinetWClass As IntPtr
       hCabinetWClass = FindWindow("CabinetWClass", vbNullString)
       SendMessage(hCabinetWClass, WM_COMMAND, WP_REFRESH_CABINET, &H0)

       'Refrescar Explorer (Windows XP)
       'Dim hExploreWClass As IntPtr
       'hExploreWClass = FindWindow("ExploreWClass", vbNullString)
       'SendMessage hExploreWClass, WM_COMMAND, WP_REFRESH_EXPLORER, &H0


       'Refrescar los iconos
       SendMessageTimeout(New IntPtr(WindowsMessages.HWND_Broadcast), WindowsMessages.WM_SettingChange, IntPtr.Zero, IntPtr.Zero,
  SendMessageTimeoutFlags.AbortIfHung, 100, IntPtr.Zero)
   End Sub
End Class


Esto lo hace actualiza en general sea cual sea el cambio que se haga en el registro.
#464
Foro Libre / Re: mejores bandas de rock
3 Octubre 2016, 22:22 PM
@Lekim la lista que has puesto si no me equivoco es la de Rock FM, es digamos los más conocidos, grandes éxitos, lo mejor del rock, pero es un lista diseñada por la censura española.

Es como decir, - ¿quieres escuchar rock? esto es lo que debes escuchar, pero solo esto. La razón es que el alma del rock, en mi opinión es la protesta. Si, el rock es para quejarse para que se me entienda. ¿Y que es lo que en España no hay? ¿Qué es lo que se veta? justamente la canción protesta.

Un grupo de  rock desconocido en España prácticamente tiene o tiene que pagar para poder tocar en alguna parte. Y si te dejan, tienen la cara dura de decirte esto no lo puedes decir, esto no lo puedes cantar. Claro aquí todo tiene que ser cien por cien canciones de amor o baile, si no nada.

Fíjate los principales cantantes, del pop y "rock" entre comillas el 100% de sus discos son de amor (o puede que el 99,9% XD). Aquí todo es canción de amor, desamor, relaciones o baile. ¿Cómo es posible? ¿No hay otra cosa que cantar en una canción?


Alejandro Sanz -Sirope-


A Que No Me Dejas
Un Zombie a la Intemperie
Capitán Tapón
Pero Tú
A Mí No Me Importa
Suena La Pelota
Tú La Necesitas
No Madura El Coco
El Club De La Verdad
El Silencio De Los Cuervos
La Vida Que Respira
Todo Huele A Ti
Un Zombie a la Intemperie (Salsa)
La Guarida Del Calor


Todas estas canciones, he estado mirando parece más de lo mismo.  Puede que alguna se refiera al amor a un hijo, u otra se de otro tema, pero la mayoría viene a ser lo mismo. Por qué, porque es lo que vende. Lo siento por nombrar a Alejandro que me cae bien, pero lo pongo por poner un ejemplo entre tantos y tantas, en España.


Vamos a ver la definición de ARTE
Manifestación de la actividad humana mediante la cual se expresa una visión personal y desinteresada que interpreta lo real o imaginado con
recursos plásticos, lingüísticos o sonoros.


El arte es una forma de expresión. ¿Qué clase de artista expresa siempre lo mismo? Aquí todo es monotemático, amor y amor. Hace unas semanas estaba haciendo zapping y vi a Nuria Fergó que había vuelto a cantar y ¿qué cantó? pues una canción que si no me equivoco, había roto con su pareja y se sentía feliz. Los "triunfitos" todo lo mismo. Es increíble.

Es como si todos los pintores españoles se dedicaran a pintar corazones. Unos abstractos, otros realistas, etc. Pero siempre lo mismo. Sería absurdo.

Por decir alguno actual que se salve, de los más comerciales y famosillos diría Estopa o Sabina. Porque hay variedad de expresividad en sus canciones y no se apuntan cien por cien a lo que saben que se vende, canciones de amor.

No se si se entiendo lo que quiero decir. Básicamente que la música actual en España, por lo menos la comercial, la que se ve, es una auténtica basura. Dedican cero tiempo a composición y a muchos les hacen las canciones. Si algo me gusta del rock es que la música, la composición, es tan protagonista o más incluso que el cantante, la voz. ¿Por qué esos que salen en los concursos parecen tan buenos cantando y luego cuando salen hacen música que parece la que le toca el gitano a la cabra? Por que las canciones que les ponen son buenas, buena música y buenas composiciones. No todo es tener buena voz, ser guapo, guapa o cantar chorradas del tipo...- te hecho de menos.... no puedo vivir si ti..., bla, bla - ya sea aflamencado o no. Hay que componer. Hagan música señores, buen música.

Así que tu lista @Lekim, no es que esté mal, pero hay mucho más que eso. No es lo mismo decir me gusta Nothing else matters que gustarte Metallica. Y si no sabes inglés te sugiero que leas sus letras traducidas, las de muchas de las canciones de las bandas y artistas que has nombrado. Muchas de las letras no las verás en autores españoles ni harto de vino.

Y para acabar, estoy harto de ver pampinflas con guitarras vestidos de cuero y cuando pones oído, dices ¿pero donde están las guitarras? XD, son solo de adorno, no saben hacer riffs, ni dar personalidad al acompañamiento, todo es un runrún de fondo para dar telón al cantante. Aquí no saben componer. O quizás el miedo a que suene heavy y les veten.

Chiquilla de Seguridad Social, bueno, ahí si que se escucha la guitarra, tiene buenos riffs, están bien metidos, pero ya ves el tema.







#465
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.

   
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 (vbnet) [Seleccionar]

''' <summary>
''' Clase NativeMethods
''' </summary>
''' <remarks></remarks>
<System.Security.SuppressUnmanagedCodeSecurity()>
Friend NotInheritable Class NativeMethods
   Inherits Attribute
   Private Sub New()
   End Sub
   ''' <summary>
   ''' Función que devuelve el identificador de una ventana
   ''' </summary>
   ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
   ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
   Private Shared Function FindWindow(
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
   End Function

   ''' <summary>
   ''' Recupera un identificador a una ventana cuyo nombre de clase
   ''' y nombre de la ventana que coincida con las cadenas especificadas.
   ''' La función busca en ventanas secundarias, comenzando por la raíz de la
   ''' ventana secundaria especificada. Esta función no realiza una búsqueda
   ''' entre mayúsculas y minúsculas.
   ''' </summary>
   ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
   ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
   ''' <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>
   ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
   Private Shared Function FindWindowEx(
                                       ByVal hWnd1 As IntPtr,
                                       ByVal hWnd2 As IntPtr,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr

   End Function
   ''' <summary>
   ''' Envía el mensaje especificado a una ventana o ventanas.
   ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
   ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
   ''' </summary>
   ''' <param name="hwnd">Un identificador de la ventana</param>
   ''' <param name="wMsg">El mensaje que se enviará.</param>
   ''' <param name="wParam">Información adicional-mensaje específico.</param>
   ''' <param name="lParam">Información adicional-mensaje específico.</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
   Private Shared Function SendMessage(ByVal hwnd As IntPtr,
                                       ByVal wMsg As Integer,
                                       ByVal wParam As Integer,
                                       lParam As Integer) As Boolean
   End Function

   Private Const WM_COMMAND = &H111
   ''' <summary>
   ''' Valores wParam para SendMessage que cambia el estilo de visualización
   ''' del escritorio
   ''' </summary>
   ''' <remarks></remarks>
   Public Enum viewOptIcon As Integer
       vIconosMuyGrandes = &H704D
       vIconosGrandes = &H704F
       vIconosMedianos = &H704E
       vIconosPequeños = &H7050
       vLista = &H7051
       vDetalle = &H704B
       vContenido = &H7052
       vMosaico = &H704C
       vOcultarIconos = &H7073 '(no bloquea el escritorio)
       vQuitarEtiquetas = &H7037
   End Enum

   ''' <summary>
   ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
   ''' </summary>
   ''' <param name="intValueView">Valor wParam para SendMessage</param>
   ''' <remarks></remarks>
   Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
   End Sub
 
End Class


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


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


Código (vbnet) [Seleccionar]

Imports System.Runtime.InteropServices

Public NotInheritable Class Form1 : Inherits Form
   Friend rdButton(7) As RadioButton
   Friend chkBox(1) As CheckBox
   Sub New()

       ' Llamada necesaria para el diseñador.
       InitializeComponent()

       ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
       Dim N As Integer = 10
       For Index As Integer = 0 To 7
           rdButton(Index) = New RadioButton With {.AutoSize = True, .Location = New Point(10, N)}
           N = N + 20
           AddHandler rdButton(Index).Click, AddressOf rdButton_Click
       Next Index
       rdButton(0).Text = "Iconos Muy Grandes"
       rdButton(1).Text = "Iconos Grandes"
       rdButton(2).Text = "Iconos Medianos"
       rdButton(3).Text = "Iconos Pequeños"
       rdButton(4).Text = "Lista"
       rdButton(5).Text = "Detalle"
       rdButton(6).Text = "Mosaico"
       rdButton(7).Text = "Contenido"
       rdButton(3).Checked = True

       chkBox(0) = New CheckBox With {
           .Location = New Point(10, rdButton(7).Top + 30), .AutoSize = True,
           .Text = "Ocultar/Mostrar Etiquetas (Solo en modo Icono y Detalle)"
       }
       chkBox(1) = New CheckBox With {
           .Location = New Point(10, chkBox(0).Top + 25), .AutoSize = True,
           .Text = "Ocultar/Mostrar Iconos"
       }
       For Index As Integer = 0 To 1
           AddHandler chkBox(Index).CheckedChanged, AddressOf chkBox_CheckedChanged
       Next


   End Sub
   Private Sub chkBox_CheckedChanged(sender As Object, e As EventArgs)
       Dim Index As Integer = Array.IndexOf(chkBox, sender)
       Select Case Index
           Case 0
               If chkBox(1).Checked = True Then
                   NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vQuitarEtiquetas)
               Else
                   NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vQuitarEtiquetas)
               End If

           Case 1
               If chkBox(0).Checked = True Then
                   NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vOcultarIconos)
               Else
                   NativeMethods.ViewModeIconDesktop(NativeMethods.viewOptIcon.vOcultarIconos)
               End If
       End Select


       'NOTA:
       'Ten en cuenta que esta aplicación no tiene medio para saber, al iniciarse, si el escritorio tiene
       'los iconos ocultos o no, o sin etiquetas, para establecer el valor verdadero o falso de
       'los objetos CheckBox
   End Sub
   Private Sub rdButton_Click(sender As Object, e As EventArgs)
       Dim Index As Integer = Array.IndexOf(rdButton, sender)
       Select Case Index
           Case 0 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosMuyGrandes)
           Case 1 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosGrandes)
           Case 2 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosMedianos)
           Case 3 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vIconosPequeños)
           Case 4 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vLista)
           Case 5 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vDetalle)
           Case 6 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vContenido)
           Case 7 : NativeMethods.ViewModeIconDesktop(intValueView:=NativeMethods.viewOptIcon.vMosaico)

       End Select



   End Sub
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       For Index As Integer = 0 To 7
           Me.Controls.Add(Me.rdButton(Index))
       Next
       For Index As Integer = 0 To 1
           Me.Controls.Add(Me.chkBox(Index))
       Next
   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs)

   End Sub
End Class
''' <summary>
''' Clase NativeMethods
''' </summary>
''' <remarks></remarks>
<System.Security.SuppressUnmanagedCodeSecurity()>
Friend NotInheritable Class NativeMethods
   Inherits Attribute
   Private Sub New()
   End Sub
   ''' <summary>
   ''' Función que devuelve el identificador de una ventana
   ''' </summary>
   ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
   ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
   Private Shared Function FindWindow(
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
   End Function

   ''' <summary>
   ''' Recupera un identificador a una ventana cuyo nombre de clase
   ''' y nombre de la ventana que coincida con las cadenas especificadas.
   ''' La función busca en ventanas secundarias, comenzando por la raíz de la
   ''' ventana secundaria especificada. Esta función no realiza una búsqueda
   ''' entre mayúsculas y minúsculas.
   ''' </summary>
   ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
   ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
   ''' <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>
   ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
   Private Shared Function FindWindowEx(
                                       ByVal hWnd1 As IntPtr,
                                       ByVal hWnd2 As IntPtr,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr

   End Function
   ''' <summary>
   ''' Envía el mensaje especificado a una ventana o ventanas.
   ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
   ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
   ''' </summary>
   ''' <param name="hwnd">Un identificador de la ventana</param>
   ''' <param name="wMsg">El mensaje que se enviará.</param>
   ''' <param name="wParam">Información adicional-mensaje específico.</param>
   ''' <param name="lParam">Información adicional-mensaje específico.</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
   Private Shared Function SendMessage(ByVal hwnd As IntPtr,
                                       ByVal wMsg As Integer,
                                       ByVal wParam As Integer,
                                       lParam As Integer) As Boolean
   End Function

   Private Const WM_COMMAND = &H111
   ''' <summary>
   ''' Valores wParam para SendMessage que cambia el estilo de visualización
   ''' del escritorio
   ''' </summary>
   ''' <remarks></remarks>
   Public Enum viewOptIcon As Integer
       vIconosMuyGrandes = &H704D
       vIconosGrandes = &H704F
       vIconosMedianos = &H704E
       vIconosPequeños = &H7050
       vLista = &H7051
       vDetalle = &H704B
       vContenido = &H7052
       vMosaico = &H704C
       vOcultarIconos = &H7073 '(no bloquea el escritorio)
       vQuitarEtiquetas = &H7037
   End Enum

   ''' <summary>
   ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
   ''' </summary>
   ''' <param name="intValueView">Valor wParam para SendMessage</param>
   ''' <remarks></remarks>
   Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
   End Sub
 
End Class






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 (vbnet) [Seleccionar]

  ''' <summary>
   ''' Oculta la cabecera del modo 'Detalle' del escritorio
   ''' </summary>
   ''' <param name="sH32State">Valor ncmdShow para ShowWindow// True=Hide, False=Normal </param>
   ''' <remarks></remarks>
   Public Shared Sub HideHeaderListView(ByVal sH32State As Boolean)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", vbNullString)
       Dim hSysListView32 As IntPtr = FindWindowEx(hDefView, IntPtr.Zero, "SysListView32", vbNullString)
       Dim hSysHeader32 As IntPtr = FindWindowEx(hSysListView32, IntPtr.Zero, "SysHeader32", vbNullString)
       ShowWindow(hSysHeader32, Convert.ToInt32(sH32State))
   End Sub


para ocultar se llamaría así

Código (vbnet) [Seleccionar]
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 (vbnet) [Seleccionar]
 ''' <summary>
   ''' Obtiene el identificador de WorkerW del escritorio
   ''' </summary>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Shared Function GetHWorkerW() As IntPtr
       Dim ClassNameChild As New System.Text.StringBuilder(255)
       Dim hWorkerW As IntPtr
       Dim hwnd As IntPtr = FindWindow(Nothing, Nothing)
       Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
           hwnd = GetNextWindow(hwnd, GW_Const.GW_HWNDNEXT)
           hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
           GetClassName(hWorkerW, ClassNameChild, 260)
       Loop
       Return hwnd
   End Function
   '//Otra forma de obtener el handle de WorkerW
   ' ''' <summary>
   ' ''' Obtiene el identificador de WorkerW del escritorio
   ' ''' </summary>
   ' ''' <returns></returns>
   ' ''' <remarks></remarks>
   'Public Shared Function GetHWorkerW() As IntPtr
   '    Dim ClassNameChild As New System.Text.StringBuilder(255)
   '    Dim hWorkerW As IntPtr
   '    Dim hwnd As IntPtr = FindWindow("Progman", Nothing)
   '    Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
   '        hwnd = GetWindow(hwnd, GW_Const.GW_HWNDPREV)
   '        hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
   '        GetClassName(hWorkerW, ClassNameChild, 260)
   '    Loop
   '    Return hwnd
   'End Function



Modificando el  código quedaría así .

Código (vbnet) [Seleccionar]
''' <summary>
''' Clase NativeMethods
''' </summary>
''' <remarks></remarks>
<System.Security.SuppressUnmanagedCodeSecurity()>
Friend NotInheritable Class NativeMethods
   Inherits Attribute
   Private Sub New()
   End Sub
   ''' <summary>
   ''' Función que devuelve el identificador de una ventana
   ''' </summary>
   ''' <param name="lpClassName">Nombre de la clase de la ventana</param>
   ''' <param name="lpWindowName">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowA", SetLastError:=True)> _
   Private Shared Function FindWindow(
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpClassName As String,
                                     <MarshalAs(UnmanagedType.LPStr)> ByVal lpWindowName As String) As IntPtr
   End Function

   ''' <summary>
   ''' Recupera un identificador a una ventana cuyo nombre de clase
   ''' y nombre de la ventana que coincida con las cadenas especificadas.
   ''' La función busca en ventanas secundarias, comenzando por la raíz de la
   ''' ventana secundaria especificada. Esta función no realiza una búsqueda
   ''' entre mayúsculas y minúsculas.
   ''' </summary>
   ''' <param name="hWnd1">Un identificador de la ventana padre cuyo hijo son ventanas que se debe buscar</param>
   ''' <param name="hWnd2">Un identificador de una ventana secundaria</param>
   ''' <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>
   ''' <param name="lpsz2">El nombre de la ventana (el título de la ventana)</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="FindWindowExA", SetLastError:=True)> _
   Private Shared Function FindWindowEx(
                                       ByVal hWnd1 As IntPtr,
                                       ByVal hWnd2 As IntPtr,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz1 As String,
                                       <MarshalAs(UnmanagedType.LPStr)> ByVal lpsz2 As String) As IntPtr

   End Function
   ''' <summary>
   ''' Envía el mensaje especificado a una ventana o ventanas.
   ''' La función SendMessagellama al procedimiento de ventana de la ventana especificada
   ''' y no vuelve hasta que el procedimiento de la ventana ha procesado el mensaje.
   ''' </summary>
   ''' <param name="hwnd">Un identificador de la ventana</param>
   ''' <param name="wMsg">El mensaje que se enviará.</param>
   ''' <param name="wParam">Información adicional-mensaje específico.</param>
   ''' <param name="lParam">Información adicional-mensaje específico.</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   <DllImport("user32", EntryPoint:="SendMessageA", SetLastError:=True)> _
   Private Shared Function SendMessage(ByVal hwnd As IntPtr,
                                       ByVal wMsg As Integer,
                                       ByVal wParam As Integer,
                                       lParam As Integer) As Boolean
   End Function

   <DllImport("user32.dll")> _
   Shared Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
   End Function

   Private Const WM_COMMAND = &H111
   ''' <summary>
   ''' Valores wParam para SendMessage que cambia el estilo de visualización
   ''' del escritorio
   ''' </summary>
   ''' <remarks></remarks>
   Public Enum viewOptIcon As Integer
       vIconosMuyGrandes = &H704D
       vIconosGrandes = &H704F
       vIconosMedianos = &H704E
       vIconosPequeños = &H7050
       vLista = &H7051
       vDetalle = &H704B
       vContenido = &H7052
       vMosaico = &H704C
       vOcultarIconos = &H7073 '(no bloquea el escritorio)
       vQuitarEtiquetas = &H7037
   End Enum
   Public Const GW_HWNDNEXT = 2

   <DllImport("user32", EntryPoint:="GetWindow", SetLastError:=True)> _
   Public Shared Function GetNextWindow(ByVal hwnd As IntPtr, ByVal wFlag As Integer) As IntPtr
   End Function
   <DllImport("user32", SetLastError:=True)> _
   Private Shared Function GetWindow(ByVal hwnd As IntPtr, ByVal wCmd As Integer) As IntPtr
   End Function

   <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
   Private Shared Function GetClassName(ByVal hWnd As System.IntPtr, _
  ByVal lpClassName As System.Text.StringBuilder, _
  ByVal nMaxCount As Integer) As Integer
   End Function

   Public Enum GW_Const
       GW_CHILD = 5
       GW_HWNDFIRST = 0
       GW_HWNDLAST = 1
       GW_HWNDNEXT = 2
       GW_HWNDPREV = 3
       GW_MAX = 5
       GW_OWNER = 4
   End Enum
   ''' <summary>
   ''' Cambia el estilo de visualización de los iconos del escritorio [by @Okik]
   ''' </summary>
   ''' <param name="intValueView">Valor wParam para SendMessage</param>
   ''' <remarks></remarks>
   Public Shared Sub ViewModeIconDesktop(ByVal intValueView As viewOptIcon)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", Nothing)

       If hDefView = IntPtr.Zero Then
           Dim hWorkerW As IntPtr = GetHWorkerW()
           hDefView = FindWindowEx(hWorkerW, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
       End If
       SendMessage(hDefView, WM_COMMAND, intValueView, &H0)
   End Sub

   ''' <summary>
   ''' Oculta las cabeceras de modo 'detalle' del escritorio
   ''' </summary>
   ''' <param name="sH32State">Valor ncmdShow para ShowWindow// True=Hide, False=Normal </param>
   ''' <remarks></remarks>
   Public Shared Sub HideHeaderListView(ByVal sH32State As Boolean)
       Dim hProgMan As IntPtr = FindWindow("Progman", "Program Manager")
       Dim hDefView As IntPtr = FindWindowEx(hProgMan, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
       If hDefView = IntPtr.Zero Then
           Dim hWorkerW As IntPtr = GetHWorkerW()
           hDefView = FindWindowEx(hWorkerW, IntPtr.Zero, "SHELLDLL_DefView", Nothing)
       End If
       Dim hSysListView32 As IntPtr = FindWindowEx(hDefView, IntPtr.Zero, "SysListView32", Nothing)
       Dim hSysHeader32 As IntPtr = FindWindowEx(hSysListView32, IntPtr.Zero, "SysHeader32", Nothing)
       ShowWindow(hSysHeader32, Convert.ToInt32(sH32State))
   End Sub

   ''' <summary>
   ''' Obtiene el identificador de WorkerW del escritorio
   ''' </summary>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Public Shared Function GetHWorkerW() As IntPtr
       Dim ClassNameChild As New System.Text.StringBuilder(255)
       Dim hWorkerW As IntPtr
       Dim hwnd As IntPtr = FindWindow(Nothing, Nothing)
       Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
           hwnd = GetNextWindow(hwnd, GW_Const.GW_HWNDNEXT)
           hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
            GetClassName(hWorkerW, ClassNameChild, 260)
       Loop
       Return hwnd
   End Function
   '//Otra forma de obtener el handle de WorkerW
   ' ''' <summary>
   ' ''' Obtiene el identificador de WorkerW del escritorio
   ' ''' </summary>
   ' ''' <returns></returns>
   ' ''' <remarks></remarks>
   'Public Shared Function GetHWorkerW() As IntPtr
   '    Dim ClassNameChild As New System.Text.StringBuilder(255)
   '    Dim hWorkerW As IntPtr
   '    Dim hwnd As IntPtr = FindWindow("Progman", Nothing)
   '    Do While Not ClassNameChild.ToString.Equals("SHELLDLL_DefView")
   '        hwnd = GetWindow(hwnd, GW_Const.GW_HWNDPREV)
   '        hWorkerW = GetWindow(hwnd, GW_Const.GW_CHILD)
   '        GetClassName(hWorkerW, ClassNameChild, 260)
   '    Loop
   '    Return hwnd
   'End Function
End Class



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




#466
Foro Libre / Re: Descarga de libros en pdf
30 Septiembre 2016, 10:40 AM
Cita de: Poyoncio en 29 Septiembre 2016, 22:22 PM
Esque creo qe lo quete pasa es que no entiendes como funciona adfly. Adfly es un acortador de urls, donde tu pones tu link te hace la url mas corta y ademas pasa por su web donde hay anuncios, por cada x personas pasadas por esa url te da x dinero. Es decir adfly es un sitio seguro si no le das a ningun anuncio.
Si te fijas cuando clicas en el link te redirige a adfly. Una vez alli te pone una cuenta atras de 5s y una vez termina le das a saltar publicidad y te lleva al link original ( en este caso te lleva a otro acortador parecido a adfly y luego al link original) hazme caso, dale a saltar publicidad y no le des a ninguno de los anuncios que te aparecen
De todos modos mi propuesta sigue en pie

Si algo me toca las narices es que me hablen como si fuera tonto de culo. Y perdome mi mal carácter pero es que estas cosas me cabrean que no veas.


¿Tengo que grabar un vídeo para demostrar lo que digo? LE HE DADO  UNA DECENA DE VECES A "SALTAR PUBLICIDAD" tras los segundos. No soy tonto se leer y he visto las instrucciones.

Te diré lo que pasa. Esa ***** ventanas estafa que han puesto los piratas ... esos solo funciona con IE11, y pongo puntos suspensivos por no decir otra cosa. IE11 es lo que usé ayer por razones que no necesito comentar. Mientras intentaba dormir caí en la cuenta y hoy lo primero que he hecho ha sido probar con el XP en virtual, con IE8 no ocurre, te redirecciona correctamente.

Y con Chrome independientemente del OS te redirecciona también correctamente y te sale la barrita verde. Sin embargo abajo de la barra [verde] otra basura de esas "Estimado usuario de Chrome- ¿Felicidades usted es el afortunado usuario de Chrome del día....". Si ahí está el enlace hacia mega, pero no exime que te salga abajo otro anuncio basura.

Por eso a ti y a otros amigo, no le ocurre lo que a mí. Porque habéis usado Firefox, Chrome o un IE8 quizás posterior al 8 y anterior al 11 porque no se si solo es con el 11


Si vais a usar este enlace:
http://difundeconocimiento.esy.es/libros/fp/libros-de-fp/

o este otro:
http://adf.ly/1dxceZ

total el primero te va a mandar al segundo...
NO USEIS Internet Explorer 11


¿que como lo se? lo he testado así de simple.  ¿lo entiendes ahora?
#467
Foro Libre / Re: Descarga de libros en pdf
29 Septiembre 2016, 22:10 PM
gracias  haré desde el virtual. Hasta que me salga el dichoso enlace verde.

pero vamos que 'libre de bichos' y de estafas, robo de contraseñas y porquerías de esas no me parece que esté. Por lo menos en el transcurso de conseguir el comprimido.

Supongo que si tienes algún plugin o extensión que bloquee este tipo de cosas no te sale.

#468
Foro Libre / Re: Descarga de libros en pdf
29 Septiembre 2016, 21:41 PM
Cita de: Poyoncio en 29 Septiembre 2016, 21:40 PM
Creo q no le das a "saltar publicidad" en adfly, sino, no te entiendo...

jaja, dale tu a ver que pasa

ahora mismo le acabo de dar otra vez y me sale entrar en Facebook, q hp. Ahora tendré que cambiar la contraseña porque tengo indentity safe que lo mete de automáticamente, gracias hombre.
#469
Foro Libre / Re: Descarga de libros en pdf
29 Septiembre 2016, 21:33 PM
Cita de: Poyoncio en 29 Septiembre 2016, 21:29 PM
A eso es obvio que no le tienes que dar, andaluz se referia dentro de los .rar

Yo me he descargado varios y sin ningun problema

Que rars. porque cada enlace que le doy me manda a esa ***** de página


Encima te dicen que le des para descargar le des justamente esos enlaces puñeteros por no decir otra cosa

http://difundeconocimiento.esy.es/como-descargar/

El enlace de descarga es una lotería unas veces te sale y otras no. Y siempre habrá algún tontainas que cae en el engaño y le da a "Reparar"
#470
Foro Libre / Re: Descarga de libros en pdf
29 Septiembre 2016, 21:22 PM
Cita de: El_Andaluz en 22 Septiembre 2016, 05:03 AM

Confirmo que esta totalmente libre de virus me lo acabo de descargar y están completos los libros es un aporte buenísimo sobre todo para los que estamos pelado de dinero y quieren estudiar. ;-) ;-) ;-)

Que pena que no se puedan dar puntos a la gente que aportan a este foro si no por mi te daba infinitos. :xD

Me ha servido de gran ayuda, muchas gracias.



¿Libre de virus?
Nada mas darle a uno de sus enlaces me manda a http://adf.ly/1dxceZ y al darle a unos de sus enlaces me sale una página de Advertencia de seguridad con apariencia de 'Microsoft' más  falsa que un billete de tres euros. De hecho cada vez que le doy me  redirecciona a otra página del mismo tipo de esas que te obligan a hacer clic en un cuadro de diálogo si o si.

Me dice que tengo daños en el equpo bla, bla, dale a aquí para reparar XD que hp.


... y otra falsa de flash player también con su diálogo de los cojones