我正在使用this post over at Microsoft's TechNet中的代码来更改正在运行的PowerShell应用程序的图标。这适用于Powershell窗口本身显示的图标,但它不会更改任务栏的图标。我改变了函数,希望它也会改变任务栏中显示的图标。
# Set the icon of the current console window to the specified icon.
#
# AUTHOR: Aaron Lerch <http://www.aaronlerch.com/blog>
# COPYRIGHT: © 2009 Aaron Lerch
# LINK: http://gallery.technet.microsoft.com/scriptcenter/9d476461-899f-4c98-9d63-03b99596c2c3
#
# PARAM:
# -IconFile
# Absolute path to the icon file.
# RETURN:
# $null
function Set-ConsoleIcon {
Param(
[parameter(Mandatory = $true)] [string] $IconFile
)
[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
# Verify the file exists
if ([System.IO.File]::Exists($iconFile) -eq $true) {
$ch = Invoke-Win32 'kernel32' ([IntPtr]) 'GetConsoleWindow'
$i = 0;
$size = 16;
while ($i -ne 4) {
$ico = New-Object System.Drawing.Icon($iconFile, $size, $size)
if ($ico -ne $null) {
Send-Message $ch 0x80 $i $ico.Handle | Out-Null
}
if ($i -eq 4) {
break
}
$i += 1
$size += 16
}
}
else {
Write-Host 'Icon file not found' -ForegroundColor 'Red'
}
}
我提供的尺寸为16
(wParam 1
),32
(wParam 2
),48
(wParam 3
)的图标,和64
(wParam 4
)。
我还尝试从启动的C#应用程序中更改Icon(基于this Stackoverflow discussion),但这根本不起作用。
如果您希望查看完整代码,请查看以下内容:
答案 0 :(得分:1)
一个简单的替代方法是创建powershell exe的快捷方式。将快捷方式的图标更改为您想要的任何内容。
然后,每当您调用脚本时,请使用快捷方式而不是PS exe。而不是
powershell.exe -ExecutionPolicy Bypass -File D:\scripts\whatever.ps1
使用
D:\scripts\powershell.lnk -ExecutionPolicy Bypass -File D:\scripts\whatever.ps1
powershell.lnk的快捷方式可以是&#34; C:\ Windows \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe&#34;或者只是没有完整路径的powershell.exe(只要为系统上的PS正确设置了PATH var)
你可以把PS快捷方式放在任何地方,但我建议你把它放在可移植性的脚本中。
现在,当您通过快捷方式启动脚本时,任务栏图标将是您通过快捷方式文件定义的任何内容。
唯一需要注意的是,快捷方式中的窗口设置将覆盖PS窗口,因此您应该定义它在快捷方式属性中的显示方式。
答案 1 :(得分:0)
这可能是不可能的。以下是有关&#34;组图标&#34;的详细信息。在任务栏中:
Change icon of group in taskbar (Win7)
<强>更新强>
您可以更改窗口的应用程序ID。由于图标主要来自应用程序ID,因此通过更改它,资源管理器不再知道默认图标,并将使用实际的窗口图标。这也将窗口从其他CMD窗口取消组合,以使个别图标可见。 (在现有的控制台窗口中执行此操作时,会出现关闭/新窗口的任务栏动画。)有一篇MSDN文章,查找&#34;应用程序ID&#34;在其中:
https://msdn.microsoft.com/en-us/magazine/dd942846.aspx
这里是它的相关代码(C ++):
#define WINVER 0x601
#define _WIN32_WINNT 0x601
#include <Propvarutil.h>
#include <propkey.h>
#include <Shellapi.h>
PROPVARIANT pv;
InitPropVariantFromString(L"MyAppID", &pv);
IPropertyStore* pps;
VERIFY(SHGetPropertyStoreForWindow(hwnd, IID_PPV_ARGS(&pps)));
VERIFY(pps->SetValue(PKEY_AppUserModel_ID, pv));
VERIFY(pps->Commit());
(链接库:shlwapi.lib)
Windows API代码包也应具有托管代码。没有查找,因为我目前在C ++应用程序中使用此功能。但我在这里找到了其他问题。
对于您的PowerShell脚本,它可能也不会有太大帮助。由于它包含了更复杂的托管代码的所有本机代码,因此我认为您最好的选择是使用一些原生帮助工具。我目前正在将此功能集成到我的FlashConsoleWindow工具中,该工具可以执行更多操作来控制窗口,例如闪烁或显示任务栏进度状态。