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

qmelpv7a  于 2023-02-26  发布在  .NET
关注(0)|答案(2)|浏览(161)

我正在使用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#应用程序(基于this Stackoverflow discussion)的图标,但根本不起作用。
如果你想看完整的代码,请看下面的代码:

pepwfjgg

pepwfjgg1#

这可能无法实现。以下是有关任务栏中"组图标"的详细信息:
Change icon of group in taskbar (Win7)

    • 更新日期:**

您可以更改窗口的应用程序ID。由于图标主要来自应用程序ID,通过改变它,资源管理器将不再知道默认图标,而将使用实际的窗口图标。2这也会将该窗口从其他CMD窗口中取消组合,以使单个图标完全可见。(当您在现有控制台窗口中执行此操作时,会出现类似于关闭/新建窗口的任务栏动画。)有一篇MSDN文章,请在其中查找"应用程序ID":
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代码包也应该有用于此的托管 Package 代码。没有查找它,因为我目前在C++应用程序中使用此函数。但我在此处找到了有关它的其他问题。
对于你的PowerShell脚本来说,这可能也不会有多大帮助。因为它都是用更复杂的托管代码 Package 起来的本机代码,我认为你最好的选择是一个小的本机帮助工具。我目前正在将这个函数集成到我的FlashConsoleWindow工具中,它可以对控制台窗口做更多的事情,比如 Flink 或显示任务栏进度状态。

jv4diomz

jv4diomz2#

一个简单的替代方法是创建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快捷方式可以是“C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe”,也可以是没有完整路径的powershell.exe(只要为系统上的PS正确设置了PATH变量)
你可以把PS快捷键放在任何地方,但是我建议你把它和脚本放在一起,以便于移植。
现在,当您通过快捷方式启动脚本时,任务栏图标将是您通过快捷方式文件定义的任何图标。
唯一需要注意的是,快捷方式中的窗口设置将覆盖PS窗口,因此您应该在快捷方式属性中定义您希望它的外观。

相关问题