#batch-file #alexa #wallpaper #philips-hue
#пакетный файл #алекса #Обои #philips-оттенок
Вопрос:
Я пытаюсь сменить обои с помощью относительно простого пакетного файла:
reg add "HKEY_CURRENT_USERcontrol paneldesktop" /v wallpaper /t REG_SZ /d C:Users*censored*Picture.jpg /f
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters
exit
Этот код работает только каждую 3-ю или 4-ю пробную версию. На самом деле это действительно смущает меня, поскольку в моей небольшой истории программирования код либо работал, либо не работал. У меня никогда не было опыта, что код должен быть в правильном настроении для реального запуска ;).
Моей первой интуицией было попробовать метод грубой силы и просто скопировать-вставить этот один лайнер несколько десятков раз. Это не решило проблему, а, наоборот, уменьшило вероятность того, что это действительно сильно изменило обои моего рабочего стола. Я также пробовал .png
и .bmp
картинки вместо .jpg
. Поскольку я совсем не разбираюсь в этом типе программирования, на данный момент я в значительной степени облажался. Может быть, кто-нибудь из вас может мне помочь. Заранее благодарю вас, если сможете.
PS: Прежде чем кто-нибудь предложит просто изменить мои обои в настройках: я пытаюсь изменить его удаленно с помощью alexa, чтобы сопоставить его с моим освещением philips hue.
Комментарии:
1. Обычно вам приходится перезагружаться, чтобы изменить фон таким образом. Я искренне удивлен, что вам вообще удалось заставить его работать.
Ответ №1:
Вам даются определения функций, которые показывают, почему это, вероятно, не будет работать. Поскольку вы переходите 0, <whatever>, null, null
к ожидаемой функции hWnd, hInst, <commandline>, WindowShowState
. Также вы говорите, что делаете это удаленно. Большинство подобных операций выполняются на отдельном рабочем столе.
Обратите внимание, что существуют ограничения на удаленный запуск кода, которые влияют на текущего пользователя..
Существует только один поддерживаемый способ смены обоев.
Public Declare Unicode Function SystemParametersInfoW Lib "user32" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_SENDWININICHANGE = amp;H2
Public Const SPIF_UPDATEINIFILE = amp;H1
Ret = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, FName, SPIF_SENDWININICHANGE SPIF_UPDATEINIFILE)
Видишь https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow
Также смотрите https://docs.microsoft.com/en-au/windows-server/administration/windows-commands/rundll32 в котором говорится: «Rundll32 может вызывать функции только из библиотеки DLL, явно написанной для вызова Rundll32».
Вот как это должно быть написано
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Комментарии:
1. Вопрос касается пакетной обработки, а не C или Visual Basic.
2. Невозможно изменить обои с помощью пакета.
3. Вы действительно можете использовать код в вопросе, если вы работаете от имени администратора, вам просто нужно перезагрузиться после запуска скрипта.
4. Вам даются определения функций, которые показывают, почему это, вероятно, не будет работать. Поскольку вы переходите
0, <whatever>, null, null
к ожидаемой функцииhWnd, hInst, <commandline>, WindowShowState
. Также вы говорите, что делаете это удаленно. Большинство подобных операций выполняются на отдельном рабочем столе.5. Как уже было сказано «Что-то темное», в данный момент я работаю с пакетным файлом. Но, тем не менее, спасибо за ваше время и ваш ответ.
Ответ №2:
Как вы запускаете пакетный файл при событии? Помимо пакетного файла (PowerShell, node и т. Д.), Существует множество скриптовых способов изменения обоев Windows. Могут быть лучшие способы сделать это, чем пакетный файл.
Комментарии:
1. На самом деле это довольно сложно… У меня есть программа alexa, которая запускает программу IFTTT, которая загружает текстовый файл в мой onedrive. Программа (AssistantCmputerControl) на моем компьютере отслеживает этот onedrive. Как только он обнаруживает файл .txt, он считывает ключевое слово, введенное в него, и запускает соответствующие события. Звучит излишне сложно, но для таких команд, как «Выключите мой компьютер», это работает в течение 3 секунд. Тем не менее, я могу запускать только события, к которым можно получить доступ в виде файла / exe с помощью обычного «двойного щелчка». Поскольку пакетная обработка иногда срабатывала, я решил, что это может быть самым простым способом решить эту проблему.
Ответ №3:
Ниже приведен гибрид пакетного / Powershell для смены обоев. Он был написан для личного использования и, как таковой, основан на каталоге %Userprofile%Pictures по умолчанию и файлах .jpg .bmp и .png, расположенных в этом дереве каталогов.
<# : batch portion
:# The above line marks the beginning of a powershell comment block; and the Batch component of the Script. Do not modify.
::# Author: T3RRY ; Creation Date 12/02/2021 ; Version: 1.0.2
::# * Batch Powershell Hybrid * Resource: https://www.dostips.com/forum/viewtopic.php?f=3amp;t=5543
::# Script Purpose:
::# - Change the wallpaper from command prompt through the use of Parameter; Or by Input if no Parameter.
::# - Script Designed for use with pictures in the %Userprofile%Pictures Directory
::# or sub directories and should be placed in the %Userprofile%Pictures Directory.
::# - Hot tip: Add the %Userprofile%Pictures Directory to your System environment Path variable.
::# https://helpdeskgeek.com/windows-10/add-windows-path-environment-variable/
@Echo off amp; Mode 120,20
:# Test for Arg 1 ; Usage output ; Offer Input or Abort
Set "Arg1=%~1"
If "%Arg1%" == "" (
Call "%~f0" "/?"
Echo/amp;Echo Enter path or Search Term; or press ENTER to Abort
Set "Wallpaper="
Set /P "Wallpaper=Enter Path or search term: "
Setlocal EnableDelayedExpansion
If "!Wallpaper!" == "" Exit /B
Call "%~f0" "!Wallpaper!"
Endlocal
Exit /B
)
:# Test for Unsupported Arg Count ; Notify Ignored Args; Show Help; Offer Abort
Set ParamErr=%*
If Not "%~2" == "" (
Setlocal EnableDelayedExpansion
Echo/Args:"!ParamErr:%Arg1% =!" Ignored. %~n0 only accepts 1 Arg.
Call "%~f0" "/?"
Endlocal
Echo/Continue with Arg1:"%Arg1%" [Y]/[N]?
For /F "Delims=" %%G in ('Choice /N /C:YN')Do if "%%G" == "N" Exit /B
)
:# /Dir Switch - Display all image paths with matching extensions in tree
If Not "%Arg1:/Dir=%" == "%Arg1%" (
Dir /B /S "*.jpg" "*.png" "*.bmp" | More
Exit /B
)
:# Usage test and output
If Not "%Arg1:/?=%" == "%Arg1%" (
Echo/ %~n0 Usage:
Echo/
Echo/ %~n0 ["wallpaper filepath" ^| "Search term"]
Echo/ Search times should include wildcard/s: * ? and / or extension as appropriate
Echo/ Example:
Echo/ Search for and apply the last found .jpg file containing Dragon in the filename:
Echo/ %~n0 "*Dragon*.jpg"
Echo/
Echo/ %~n0 [/Dir] - output list of available .jpg .png and .bmp files in the directory tree
Echo/ %~n0 [/?] - help output
Exit /B
)
Set "Wallpaper=%Arg1%"
:# Arg1 Not a valid path; Offer Addition of Wildcards to SearchTerm If not Present as Bookends
If not exist "%Wallpaper%" If not "%Wallpaper:~0,1%" == "*" If not "%Wallpaper:~,-1%" == "*" (
Echo/Add wildcards to "%Wallpaper%" {"*%Wallpaper%*"} [Y]/[N]?
For /F "Delims=" %%G in ('Choice /N /C:YN')Do if "%%G" == "Y" Set "Wallpaper=*%Wallpaper%*"
)
:# To support Search Terms run script in Top level of Directory containing Images; Find Full Path in Tree.
PUSHD "%Userprofile%Pictures"
Set "Matches=0"
(For /F "Delims=" %%G in ('Dir /B /S "%Wallpaper%"')Do (
Set "Wallpaper=%%~fG"
Set /A Matches =1
)) 2> Nul
:# Determine if Target Wallpaper is Current Wallpaper; Notify and Exit
reg query "HKEY_Current_UserControl Paneldesktop" -v wallpaper | %__AppDir__%findstr.exe /LIC:"%Wallpaper%" amp;amp; (
Echo/Wallpaper already applied.
Exit /B
)
:# Report When Multiple Matches found; Identifying Path Used.
Setlocal EnableDelayedExpansion
If %Matches% GTR 1 (
Echo/%Matches% Files Matched:"!Arg1!"
Echo/File Used: "!Wallpaper!"
)
:# Pipe Filepath to Powershell; Capture as Powershell Variable within Pipe; Exit on Return.
Echo/!Wallpaper!| powershell.exe -noprofile "$Image = $input | ?{$_}; iex (${%~f0} | out-string)"
Endlocal
POPD
Exit /B 0
:# The below line Marks the end of a Powershell comment Block; And the End of the Batch Script. Do not Modify.
: end batch / begin powershell #>
Function Set-WallPaper($Image) {
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Params
{
[DllImport("User32.dll",CharSet=CharSet.Unicode)]
public static extern int SystemParametersInfo (Int32 uAction,
Int32 uParam,
String lpvParam,
Int32 fuWinIni);
}
"@
$SPI_SETDESKWALLPAPER = 0x0014
$UpdateIniFile = 0x01
$SendChangeEvent = 0x02
$RefreshIni = $UpdateIniFile -bor $SendChangeEvent
$ret = [Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $Image, $RefreshIni)
}
If (Test-Path $Image) {
Set-WallPaper -Image $Image
write-output "Wallpaper Updated."
}else {
write-output "Wallpaper Does not exist in the Directory Tree."
}