有没有一种方法可以改变使用Perl脚本在Windows文件夹图标?
我的目的是为“xxx_documents”文件夹的图标普通更改为其他图标。 我要的,因为它负责整个驱动器这样的方式运行该脚本。
该驱动器包含多个文件夹。 我要搜索名为“文件”(如“xxx_documents”或简称“文件”),每个文件夹,并从改变到一个图标"%SystemRoot%\system32\SHELL32.dll"
库。
这有可能在Perl? 感谢所有谁帮助我。
有没有一种方法可以改变使用Perl脚本在Windows文件夹图标?
我的目的是为“xxx_documents”文件夹的图标普通更改为其他图标。 我要的,因为它负责整个驱动器这样的方式运行该脚本。
该驱动器包含多个文件夹。 我要搜索名为“文件”(如“xxx_documents”或简称“文件”),每个文件夹,并从改变到一个图标"%SystemRoot%\system32\SHELL32.dll"
库。
这有可能在Perl? 感谢所有谁帮助我。
你肯定可以用Perl做。 通过的Windows使用一个隐藏的系统的控制目录图标Dekstop.ini
每个文件夹中的文件。 内容看起来是这样的:
[.ShellClassInfo]
IconFile=%SystemRoot%\system32\SHELL32.dll
IconIndex=41
在Windows XP(我假设在其他系统),图标41是一棵树。 Windows需要此文件中明确设定为一个系统文件,它的工作,这意味着我们需要向下挖掘到Win32API::File
来创建它:
#!/usr/bin/perl
use strict;
use warnings;
use Win32API::File qw(createFile WriteFile fileLastError CloseHandle);
my $file = createFile(
'Desktop.ini',
{
Access => 'w', # Write access
Attributes => 'hs', # Hidden system file
Create => 'tc', # Truncate/create
}
) or die "Can't create Desktop.ini - " . fileLastError();
WriteFile(
$file,
"[.ShellClassInfo]\r\n" .
"IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" .
"IconIndex=41\r\n",
0, [], []
) or die "Can't write Desktop.ini - " . fileLastError();
CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError();
如果你运行上面的代码,就应该设置的图标当前目录树。 您可能需要刷新目录列表探险拿起变化之前。
现在,我们有办法来改变图标,我们现在可以步行穿过整个驱动器,并改变每一个我们的模式相匹配的文件夹。 我们可以做到这一点很容易地File::Find
,或者其替代品之一(例如, File::Find::Rule
,或File::Next
):
#!/usr/bin/perl
use strict;
use warnings;
use File::Find qw(find);
use Win32API::File qw(createFile WriteFile fileLastError CloseHandle);
my $topdir = $ARGV[0] or die "Usage: $0 path\n";
find( \&changeIcon, $topdir);
sub changeIcon {
return if not /documents$/i; # Skip non-documents folders
return if not -d; # Skip non-directories.
my $file = createFile(
"$_\\Desktop.ini",
{
Access => 'w', # Write access
Attributes => 'hs', # Hidden system file
Create => 'tc', # Truncate/create
}
) or die "Can't create Desktop.ini - " . fileLastError();
WriteFile(
$file,
"[.ShellClassInfo]\r\n" .
"IconFile=%SystemRoot%\\system32\\SHELL32.dll\r\n" .
"IconIndex=41\r\n",
0, [], []
) or die "Can't write Desktop.ini - " . fileLastError();
CloseHandle($file) or die "Can't close Desktop.ini - " . fileLastError();
}
不幸的是,我刚刚发现图标只得到改变,如果该目录目前拥有或曾经拥有,图标...有清楚的就是BEING上会导致Windows寻找一个目录本身设置属性Desktop.ini
文件,但我不能为我的生活弄清楚它是什么。 这样,上述溶液是不完全的; 我们还需要找到和修复,我们要添加的图标上的目录的属性。
保罗
1。
[.ShellClassInfo]
LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21790
InfoTip=@%SystemRoot%\system32\shell32.dll,-12689
IconResource=%SystemRoot%\system32\imageres.dll,-108
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=-237
2。
[.ShellClassInfo]
LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21803
InfoTip=@%SystemRoot%\system32\shell32.dll,-12689
IconResource=%SystemRoot%\system32\imageres.dll,-3
为了让图标刷新,你将不得不调用一些SHChangeNotify巫毒(C ++的例子,但你的想法):
int imageIndex = Shell_GetCachedImageIndexW(wPath, GetSyncFolderIconIndex(), 0);
if (imageIndex != -1)
{
// If we don't do this, and we EVER change our icon, Explorer will likely keep
// using the old one that it's already got in the system cache.
SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD | SHCNF_FLUSHNOWAIT, &imageIndex, NULL);
}
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSHNOWAIT, wPath, NULL);