Powershell更改运行控制台应用程序的任务栏图标

时间:2014-02-26 11:46:07

标签: c# .net wpf windows powershell

我正在使用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'
  }
}

我提供的尺寸为16wParam 1),32wParam 2),48wParam 3)的图标,和64wParam 4)。

我还尝试从启动的C#应用​​程序中更改Icon(基于this Stackoverflow discussion),但这根本不起作用。

如果您希望查看完整代码,请查看以下内容:

2 个答案:

答案 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工具中,该工具可以执行更多操作来控制窗口,例如闪烁或显示任务栏进度状态。