Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Как получить(узнать) путь откуда взята текущая обоина? (http://forum.oszone.net/showthread.php?t=184833)

Dark Ange1 07-09-2010 13:04 1490246

Как получить(узнать) путь откуда взята текущая обоина?
 
Я хочу добавить в контекстное меню возможность удаления текущего изображения рабочего стола при включенной функции "Показ слайдов". Может кто знает хотя бы как узнать путь текущей обоины? Не тот, что записан в реестре HKEY_CURRENT_USER\Control Panel \Desktop\ Dword Wallpaper, а реальный, откуда эта обоина взята?

Вот, где хранится путь к файлу, который является источником для текущей обоины HKCU\Software\Microsoft\Internet Explorer\Desktop\General ключ dword WallpaperSource

madmasles 07-09-2010 13:45 1490292

Dark Ange1,
Попробуйте так:
Код:

$sKeyName = 'HKEY_CURRENT_USER\Control Panel\Desktop'
;Для Windows XP:
$sValue_1 = 'Wallpaper'
$sValue_2 = 'ConvertedWallpaper'
MsgBox(0, '', RegRead($sKeyName, $sValue_1) & @CRLF & RegRead($sKeyName, $sValue_2))
;Для Windows 7:
MsgBox(0, '', RegRead($sKeyName, $sValue_1))

Удалить и восстановить обратно обои у меня так получилось:
Код:

#RequireAdmin
;Проверял только на Windows XP и Windows 7
$iDel = _DelWallpaper()
If $iDel = -2 Then
    MsgBox(0, '', 'Не поддерживается')
    Exit
ElseIf $iDel = 1 Then
    Sleep(3000)
    $iSet = _SetWallpaper()
EndIf

Func _DelWallpaper()
    If @OSVersion <> 'WIN_XP' And @OSVersion <> 'WIN_7' Then
        Return SetError(1, 0, -2)
    EndIf
    Local Const $SPIF_UPDATEINIFILE = 0x0001
    Local Const $SPIF_SENDCHANGE = 0x0002
    Local Const $SPI_SETDESKWALLPAPER = 0x0014
    Local $hImage, $sCLSID, $tBuffer
    $tBuffer = DllStructCreate("char Text[""]")
    DllStructSetData($tBuffer, "Text", "")
    RegWrite('HKCU\Control Panel\Desktop', 'Wallpaper', 'REG_SZ', "")
    DllCall("User32.dll", "int", "SystemParametersInfo", "int", $SPI_SETDESKWALLPAPER, "int", 0, _
            "ptr", DllStructGetPtr($tBuffer), "int", BitOR($SPIF_UPDATEINIFILE, $SPIF_SENDCHANGE))
    Return 1
EndFunc  ;==>_DelWallpaper

Func _SetWallpaper()
    Local Const $SPIF_UPDATEINIFILE = 0x0001
    Local Const $SPIF_SENDCHANGE = 0x0002
    Local Const $SPI_SETDESKWALLPAPER = 0x0014
    Local $hImage, $sCLSID, $tBuffer, $sTemp_File
    If @OSVersion = 'WIN_XP' Then
        $sTemp_File = @UserProfileDir & "\Local Settings\Application Data\Microsoft\Wallpaper1.bmp"
    ElseIf @OSVersion = 'WIN_7' Then
        $sTemp_File = @AppDataDir & "\Microsoft\Windows\Themes\TranscodedWallpaper.jpg"
    Else
        Return SetError(1, 0, -2)
    EndIf

    If Not FileExists($sTemp_File) Then Return SetError(1, 0, -1)
    $tBuffer = DllStructCreate("char Text[" & StringLen($sTemp_File) + 1 & "]")
    DllStructSetData($tBuffer, "Text", $sTemp_File)
    RegWrite('HKCU\Control Panel\Desktop', 'Wallpaper', 'REG_SZ', $sTemp_File)
    DllCall("User32.dll", "int", "SystemParametersInfo", "int", $SPI_SETDESKWALLPAPER, "int", 0, _
            "ptr", DllStructGetPtr($tBuffer), "int", BitOR($SPIF_UPDATEINIFILE, $SPIF_SENDCHANGE))
    Return 1
EndFunc  ;==>_SetWallpaper


Dark Ange1 08-09-2010 13:09 1491016

Это конечно, хорошо, а если обои расположены, например, на D:\Обои? и в реестре вроде нигде нет указания, какой именно файл из D:\Обои в данную минуту используется...

Dark Ange1 17-03-2011 16:44 1637143

Вобщем, потратил на поиск решения не один день, тоже нужно было удалять картинки, которые не нравились :biggrin: Вобщем, как-то случайно нарыл путь, ковыряясь в реестре:yahoo: Ну и спасибо Oszone, мне тут помогли с пакетным файлом, который я "доработал напильником" под свои нужды. Вобщем, я изгольнулся так - написал батник, конвертировал его в EXE Этой прогой, потом при помощи любого (Я пользовался Windows 7 manager) редактора контекстного меню создал пункт, ссылающийся на созданный экзешник. Пункт нужно создавать для контекстного меню рабочего стола. Ну, это мелочи. Главное - это батник (хоть оно и CMD, хе-хе)
Вот мой вариант:
1) Для удаления
Код:

chcp 1251
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Microsoft\Internet Explorer\Desktop\General"^|Find /I "WallpaperSource"`) Do Set Wallpath=%%~J
del "%wallpath%"

2) Для копирования в C:\Temp\wallmove.txt пути текущей обоины (включая имя файла) и перемещения файла картинки в папку C:\Walls (обе папки должны быть предварительно созданы). Типа вдруг передумаешь потом :biggrin:
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Microsoft\Internet Explorer\Desktop\General"^|Find /I "WallpaperSource"`) Do Echo %%J>C:\Temp\wallmove.txt
For /F "tokens=* delims=" %%i In (C:\Temp\Wallmove.txt) Do move /y "%%i" C:\walls\

ЗЫ. Возможно, в начало кода придется добавить CHCP 866 или CHCP 1251 (не помню что именно), чтобы в текстовый файл выводились не кракозябры, если имена файлов картинок будут кириллицей. Ну, это мелочи, я думаю.

ramax 09-12-2011 07:15 1811966

не работает для папки по умолчанию: C:\Windows\Web\Wallpaper
и картинка с экрана исчезает с задержкой секунд 5-10

Valvet 24-01-2017 17:26 2705889

Как получить файл картинку на Windows 10?

ramax 28-02-2017 18:07 2715447

не работает под Windows 8.1

Iska 28-02-2017 19:20 2715467

Что «не работает»? Под какой именно «Windows 8.1»?

Malice 15-10-2017 13:53 2770726

Win 10 pro x64 15063
Индусы всё сломали. Удаляет картинку по адресу %userprofile%\AppData\Local\Temp\*.png
На superuser это обсуждали, там решение через vbscript и часть уже не работает.

furr7325@vk 03-12-2017 13:24 2781990

https://youtu.be/tmaVEk-zhRE вот может поможет.


Время: 20:33.

Время: 20:33.
© OSzone.net 2001-