1

如何通过我在博客文章中找到的脚本设置 Windows 7 用户磁贴。但是我不想要这个需要的 .NET 框架依赖,所以我尝试通过DllCall()直接调用它。但是我不能让它工作:

#RequireAdmin
FileCopy("user_tile.jpg", "C:\Windows\system32\user_tile.jpg")
$rtn = DllCall(@SystemDir & "\shell32.dll", "long", 262, "wstr", "ahiscox", "int", 0, "wstr", "C:\Windows\system32\user_tile.jpg")
MsgBox(16, "DLL Return", $rtn[0])

我得到了 -2147024894 的返回值(似乎 shell32.dll 没有找到 user_tile.jpg)。更改为 wstr 后,返回 -2147221008。当我运行代码时,没有任何反应(用户磁贴未更改)。

4

3 回答 3

3

感谢 fejesjoco,我也希望将示例代码从您的博客转换为 AutoIt,但无法使其正常工作。CoInitialize 建议做到了,你可以 在 AutoIt 论坛的这个线程中找到 AutoIt 代码。

$sUserName = "DOMAIN\rvdmast"
$sPicPath = "\\server\data\fotos\rvdmast.jpg"

; call CoInitialize
DLLCall("ole32.dll","int","CoInitialize","ptr",0)

$hPicPath = DLLStructCreate("wchar[128]")
DllStructSetData($hPicPath, 1, $sPicPath)

$hUserName = DLLStructCreate("wchar[128]")
DllStructSetData($hUserName, 1, $sUserName)

$aRet = DllCall(@SystemDir & "\shell32.dll", "long", 262, "ptr", DllStructGetPtr($hUserName), "int", 0, "ptr", DllStructGetPtr($hPicPath))

MsgBox(4096, "SetUserTile", $aRet[0])
于 2011-05-31T09:13:42.443 回答
2

您也可以询问该博客的作者,他是一个乐于助人的人,我知道是因为是我 :) 您应该检查您的线程是否在 STA 公寓中。此外,您可能需要自己调用 CoInitialize,在 .NET 中,框架会为您执行此操作,但这是一个先决条件。

于 2011-04-08T19:51:00.153 回答
1

该博客提到您需要以 MACHINE\user 或 DOMAIN\user 格式指定用户名。除此之外,我认为您可以使用相对图片路径,并且不需要在 shell32 中安装它(然后您可能也不需要管理员权限),但是一旦您开始工作,请尝试。

于 2011-03-01T09:02:11.033 回答