Batch file 我的批处理文件只有在心情正常时才会执行

Batch file 我的批处理文件只有在心情正常时才会执行,batch-file,alexa,wallpaper,philips-hue,Batch File,Alexa,Wallpaper,Philips Hue,我正试图用一个相对简单的批处理文件更改我的壁纸: reg add "HKEY_CURRENT_USER\control panel\desktop" /v wallpaper /t REG_SZ /d C:\Users\*censored*\Picture.jpg /f RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters exit 此代码仅在第三次或第四次试用时有效。这实际上让我很困惑,因为在我小小的编程历史中,

我正试图用一个相对简单的批处理文件更改我的壁纸:

reg add "HKEY_CURRENT_USER\control panel\desktop" /v wallpaper /t REG_SZ /d C:\Users\*censored*\Picture.jpg /f 
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters 
exit 
此代码仅在第三次或第四次试用时有效。这实际上让我很困惑,因为在我小小的编程历史中,一段代码要么成功,要么失败。我从未有过这样的经验,代码必须处于正确的状态才能实际运行;)

我的第一个直觉是尝试暴力的方式,只是复制粘贴这一行几十次。 这并没有解决问题,但恰恰相反,它实际上改变了我的桌面墙纸很多的可能性。我还尝试了
.png
.bmp
图片,而不是
.jpg
。因为我根本没有受过这种编程方面的教育,所以我现在几乎完蛋了。也许你们中有人能帮我。如果可以的话,先谢谢你


PS:在任何人建议在设置中更改我的墙纸之前:我正在尝试使用alexa远程更改墙纸,以便与我的飞利浦色调照明匹配。

您将获得功能定义,说明它可能无法工作的原因。当您将
0、null、null
传递给一个函数时,该函数需要
hWnd、hInst、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 = &H2
Public Const SPIF_UPDATEINIFILE = &H1

Ret = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, FName, SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE)

另请参见“Rundll32只能从显式编写为由Rundll32调用的DLL中调用函数”的说明

必须这样写

 void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

如何在事件中触发批处理文件?除了批处理文件(,等等)之外,还有许多可编写脚本的方法可供您更改Windows墙纸。可能有比批处理文件更好的方法来实现这一点。

下面是一个用于更改墙纸的批处理/Powershell混合程序。 它是为个人使用编写的脚本,因此基于默认的%Userprofile%\Pictures目录以及位于该目录树中的.jpg.bmp和.png文件

Nul
:#确定目标壁纸是否为当前壁纸;通知并退出
reg查询“HKEY_Current_User\Control Panel\desktop”-v wallpaper |%\uuuuuuuu AppDir_uuuu%findstr.exe/LIC:“%wallpaper%”和(
已应用回声/壁纸。
退出/B
)
:#发现多个匹配项时报告;识别使用的路径。
Setlocal EnableDelayedExpansion
如果%1与%GTR 1匹配(
Echo/%Matches%匹配的文件:“!Arg1!”
使用的回声/文件:“!墙纸!”
)
:#到Powershell的管道文件路径;捕获为管道内的Powershell变量;返回时退出。
回声!墙纸powershell.exe-noprofile“$Image=$input |?{$};iex(${%~f0}| out string)”
端部
流行音乐
退出/b0
:#下一行标记Powershell注释块的结束;以及批处理脚本的结尾。不要修改。
:结束批处理/开始powershell>
功能集壁纸($Image){
添加类型-类型定义@”
使用制度;
使用System.Runtime.InteropServices;
公共类参数
{ 
[DllImport(“User32.dll”,CharSet=CharSet.Unicode)]
公共静态外部int系统参数INFO(Int32 uAction,
Int32 uParam,
字符串lpvParam,
Int32(福威尼尼);
}
"@ 
$SPI_setdeskwallpar=0x0014
$UpdateIniFile=0x01
$SendChangeEvent=0x02
$RefreshIni=$UpdateInFile-bor$SendChangeEvent
$ret=[Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER,0,$Image,$RefreshIni)
}
If(测试路径$Image){
设置壁纸-图像$Image
写入输出“墙纸更新”
}否则{
写入输出“目录树中不存在墙纸。”
}

通常必须重新启动才能以这种方式更改背景。我真的很惊讶,你已经成功地完成了这个任务。问题是关于批处理,而不是C++或Visual Basic。不可能用批处理来改变墙纸。如果你运行的是管理员,你实际上可以使用问题中的代码。脚本运行后,您只需重新启动。您将获得函数定义,这些定义说明了它可能无法工作的原因。当您将
0、null、null
传递给一个函数时,该函数需要
hWnd、hInst、WindowShowState
。你还说你是远程操作的。大多数像这样的操作都在一个单独的桌面上运行。正如“黑暗的东西”已经说过的,我现在正在处理一个批处理文件。不过,谢谢你的时间和回答。这其实很复杂。。。我有一个alexa例程,它触发一个IFTTT例程,将一个.txt文件上传到我的onedrive中。我的计算机上有一个程序(AssistantComputerControl)监视这个onedrive。一旦检测到.txt文件,它就会读取放入其中的关键字,并根据事件触发。听起来不太复杂,但对于“关机”之类的命令,它可以在3秒钟内工作。然而,我只能通过典型的“双击”触发可以作为文件/exe访问的事件。由于批处理有时会工作,我认为这可能是解决这个问题的最简单方法。