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

 

 


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


+  Foro de elhacker.net
|-+  Sistemas Operativos
| |-+  Windows (Moderador: Randomize)
| | |-+  Papel Tapiz con carpeta de imágenes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Papel Tapiz con carpeta de imágenes  (Leído 6,101 veces)
bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Papel Tapiz con carpeta de imágenes
« en: 2 Febrero 2021, 21:26 pm »

Necesito saber cómo se obtiene la ruta de la imagen de fondo en windows 8.1 y si es posible en windows 10 también

OJO!!!!! cuando esta puesta una carpeta con varias imágenes que van cambiando cada cierto tiempo.


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.176



Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #1 en: 2 Febrero 2021, 21:39 pm »

Las que vienen por defecto: C:\Windows\Web\Wallpaper\

Se obtienen buscándolas, por ejemplo un buen buscador de archivos es Everything de VoidTools: https://www.voidtools.com/ . Si mantienes el cursor del mouse sobre la imagen aparece su nombre con su extensión, luego solo buscas ese nombre en Everything, justo debe estar en el Disco C, carpeta igual al que muestra la pantalla de configuración de Fondos de Escritorio (Flores, Tierra, Windows, etc)


En línea

bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #2 en: 3 Febrero 2021, 00:32 am »

Parece que no me explique bien, yo me refiero a que en el registro de Windows en la clave

HKEY_CURRENT_USER\Control Panel\Desktop

en el valor Wallpaper aparece la ruta completa de la imagen de papel tapiz actual.

El problema es que cuando pongo una carpeta de imágenes para que cambie el papel tapiz cada cierto tiempo lo que aparece en ese valor del registro es

C:\Users\Usuario\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper

Y de esta manera no puedo obtener la ruta de la imagen actual y quisiera saber si existe algún método para obtener la ruta en este caso

Gracias
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.176



Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #3 en: 3 Febrero 2021, 01:08 am »

Pues esa misma es la ruta de la imagen actual: C:\Users\Usuario\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper

Solo que ese TranscodedWallpaper no tiene extensión pero si es la imagen actual que va creando y reemplazando el propio Windows cada cierto tiempo, dicho tiempo es especificado en la propia configuración de Fondo de Pantalla.

Puedes hacer la prueba copiándolo y renombrándolo con la extensión apropiada, ya sea .jpg o .png
En línea

bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #4 en: 3 Febrero 2021, 04:28 am »

Waooo, nunca se me hubiera ocurrido eso. Pero ese mecanismo solo empeora mi situación, ya que no obtengo la ruta de la imagen original, solo la de la copia que hace windows.

Lo que necesito es la ruta de la imagen original que ahora me parece más complejo de obtener

Gracias
En línea

Mr. NoBody

Desconectado Desconectado

Mensajes: 20


"You Take The Red Pill - You Stay In Wonderland"


Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #5 en: 4 Febrero 2021, 17:01 pm »

Lo que necesito es la ruta de la imagen original que ahora me parece más complejo de obtener

La ruta que deseas obtener puedes localizarla, codificada, en el valor de registro: 'HKEY_CURRENT_USER\Control Panel\Desktop' > 'TranscodedImageCache', en formato de texto Unicode (UTF-16).

He desarrollado un sencillo script en PowerShell / VB.NET que se puede iniciar por linea de comandos para obtener la ruta del wallpaper actual:

Código
  1. $vbCode = @'
  2. Imports Microsoft.VisualBasic
  3. Imports Microsoft.Win32
  4. Imports System
  5. Imports System.Security.AccessControl
  6. Imports System.Text
  7.  
  8. Public NotInheritable Class WallpaperUtils
  9.  
  10.    Public Shared Function GetCurrentWallpaperPath() As String
  11.  
  12.        Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default),
  13.              subKey As RegistryKey = baseKey.OpenSubKey("Control Panel\Desktop", RegistryRights.QueryValues)
  14.  
  15.            ' Main registry value
  16.            Const prefixByteSize As Integer = 24
  17.            Dim transcodedImageCache As Byte() = CType(subKey.GetValue("TranscodedImageCache"), Byte())
  18.            If (transcodedImageCache IsNot Nothing) AndAlso (transcodedImageCache.Length > prefixByteSize) Then
  19.                Dim pathRaw As String = Encoding.Unicode.GetString(transcodedImageCache)
  20.                Dim path As String = pathRaw.Substring(prefixByteSize \ 2).TrimEnd(ControlChars.NullChar)
  21.                If Not String.IsNullOrWhiteSpace(path) Then
  22.                    Return path
  23.                End If
  24.            End If
  25.  
  26.            ' Alternative registry value
  27.            Dim wallpaper As String = CStr(subKey.GetValue("WallPaper"))
  28.            If Not String.IsNullOrWhiteSpace(wallpaper) Then
  29.                Return wallpaper
  30.            End If
  31.  
  32.        End Using
  33.  
  34.        Return Nothing
  35.  
  36.    End Function
  37.  
  38. End Class
  39. '@
  40.  
  41. $WallpaperUtilsType =
  42.    Add-Type -TypeDefinition $vbCode `
  43.             -CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider) `
  44.             -PassThru `
  45.             -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
  46.                                   "System.dll" `
  47.                                   | where { $_.IsPublic }
  48.  
  49. $wallpaperPath = [WallpaperUtils]::GetCurrentWallpaperPath()
  50.  
  51. Write-Host $wallpaperPath
  52.  
  53. $console = [System.Console]
  54. $console::WriteLine("Press any key to exit...")
  55. $console::ReadKey($true)
  56. Exit(0)



Esta parte puedes eliminarla completamente del script si lo prefieres:
Código
  1. $console = [System.Console]
  2. $console::WriteLine("Press any key to exit...")
  3. $console::ReadKey($true)
...de esta forma podrías iniciar el script de PowerShell desde un Batch-script o como desees para automatizar la obtención del valor de la ruta del wallpaper sin detener la ejecución del script.

PD: Esta metodología funcionará siempre y cuando el usuario no haya eliminado intencionada o involuntariamente los valores de registro 'TranscodedImageCache' y 'Wallpaper' después de haber aplicado el wallpaper, lo cual no debería suceder en ninguna circunstancia a menos que uno vaya al registro de Windows y los elimine intencionadamente como ya dije.

Saludos.
« Última modificación: 4 Febrero 2021, 17:35 pm por Mr. NoBody » En línea

Mr. NoBody

Desconectado Desconectado

Mensajes: 20


"You Take The Red Pill - You Stay In Wonderland"


Ver Perfil
Re: Papel Tapiz con carpeta de imágenes
« Respuesta #6 en: 10 Febrero 2021, 01:12 am »

En vista de que por otros comentarios tuyos que vi en el foro al parecer utilizas VB.NET, te comento otras dos opciones utilizando directamente la API de Windows.

La primera es mediante una llamada a la función 'SystemParametersInfo' pasándole el valor 'SPI_GETDESKWALLPAPER' (0x0073) al parámetro 'uiAction':

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724947(v=vs.85).aspx
Código
  1. <DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Auto, BestFitMapping:=False, ThrowOnUnmappableChar:=True)>
  2. Public Shared Function SystemParametersInfo(action As UInteger,
  3.                                            uiParam As UInteger,
  4.                               <[In]> <Out> pvParam As StringBuilder,
  5.                                            winIni As UInteger
  6. ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  7. End Function

Modo de empleo:
Código
  1. Public Shared Function GetCurrentWallpaperPath() As String
  2.    Dim sb As New System.Text.StringBuilder(capacity:=260)
  3.  
  4.    If Not NativeMethods.SystemParametersInfo(&H73UI, CUInt(sb.Capacity), sb, Nothing) Then
  5.        Throw New Win32Exception([error]:=Marshal.GetLastWin32Error())
  6.    Else
  7.        Return sb.ToString()
  8.    End If
  9. End Function

La segunda es mediante la función 'GetWallpaper' de la interfaz 'IActiveDesktop':

https://msdn.microsoft.com/en-us/library/windows/desktop/bb776357%28v=vs.85%29.aspx
Código
  1. Imports System.Runtime.InteropServices
  2. Imports System.Text
  3.  
  4. Namespace NativeMethods
  5.  
  6.    <ComImport>
  7.    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
  8.    <Guid("F490EB00-1240-11D1-9888-006097DEACF9")>
  9.    Public Interface IActiveDesktop
  10.        Function NotImplemented01() As Integer
  11.        <PreserveSig()> Function GetWallpaper(<MarshalAs(UnmanagedType.LPWStr)> buffer As StringBuilder, bufferSize As Integer, reserved As Integer) As Integer
  12.        Function NotImplemented02() As Integer
  13.        Function NotImplemented03() As Integer
  14.        Function NotImplemented04() As Integer
  15.        Function NotImplemented05() As Integer
  16.        Function NotImplemented06() As Integer
  17.        Function NotImplemented07() As Integer
  18.        Function NotImplemented08() As Integer
  19.        Function NotImplemented09() As Integer
  20.        Function NotImplemented10() As Integer
  21.        Function NotImplemented11() As Integer
  22.        Function NotImplemented12() As Integer
  23.        Function NotImplemented13() As Integer
  24.        Function NotImplemented14() As Integer
  25.        Function NotImplemented15() As Integer
  26.        Function NotImplemented16() As Integer
  27.        Function NotImplemented17() As Integer
  28.        Function NotImplemented18() As Integer
  29.    End Interface
  30.  
  31. End Namespace

Modo de empleo:
Código
  1. Public Shared Function GetCurrentWallpaperPath() As String
  2.  
  3.    Dim typeActiveDesktop As Type = Type.GetTypeFromCLSID(New Guid("{75048700-EF1F-11D0-9888-006097DEACF9}"))
  4.    Dim activeDesktop As IActiveDesktop = DirectCast(Activator.CreateInstance(typeActiveDesktop), IActiveDesktop)
  5.    Dim sb As New System.Text.StringBuilder(capacity:=260)
  6.  
  7.    Dim result As Integer = activeDesktop.GetWallpaper(sb, sb.Capacity, 0)
  8.    If (result <> 0) Then
  9.        Marshal.ThrowExceptionForHR(result)
  10.    End If
  11.  
  12.    Marshal.ReleaseComObject(activeDesktop)
  13.    Return sb.ToString()
  14. End Function
« Última modificación: 10 Febrero 2021, 03:32 am por Mr. NoBody » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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