一些 .exe 文件在任务栏上有图标,但图标为空白

一些 .exe 文件在任务栏上有图标,但图标为空白

我安装的大多数游戏都是 GOG 版本,安装程序会生成大量不必要的文件,所有游戏都有卸载程序,如果我想卸载,我只需删除安装文件夹即可。我使用这个 PowerShell 命令来删除这些无用的文件,它有效:

# I have confirmed deleting these files doesn't affect the functions of the games

function Remove-GOG ($game) {
  Get-ChildItem -path $game -file | Where-Object {$_.fullname -match "gog.ico|goggame|support.ico|webcache|gameuxinstallhelper.dll|unins\d{3}|launch.+\.lnk|eula.txt"} | remove-item
}

但是,每当我直接使用可执行文件启动这样的游戏时,它在任务栏中的图标都是空白的,即图标已被删除的快捷方式的通用图标。

  • 可执行文件本身包含图标,并且我没有使用快捷方式启动游戏。
  • 可执行文件未固定到任务栏,并且图标不存在:
    %APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
    
  • 该快捷方式与 相同,launch {game_name}.lnk并使用goggame-{game_id}\.(ico|dll)图标文件,可使用上述 PowerShell 函数删除该文件

如何以编程方式删除注册表中的幽灵快捷方式并将原始图标恢复为任务栏快捷方式?


通过缓慢的 GUI 解决并手动更改图标(首先收到文件未找到消息)启动游戏后,我必须通过以下方式切换到桌面:

  • Alt+ Tab→ 右键单击​​任务栏快捷方式 →特性更改图标...

我相信快捷方式必须与注册表中的可执行文件相关联,从而使任务栏图标使用已删除的.ico文件,并且每当我直接运行游戏时,尽管快捷方式文件已被删除,快捷方式仍会覆盖可执行文件的任务栏图标。

  • 经过谷歌的繁琐搜索后,我找到了最相关的密钥,但不知道它是否是密钥:
    HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\UFH\SHC
    
  • 当给定可执行文件的绝对路径时,我希望任务栏图标使用在可执行文件本身内部找到的图标。

答案1

问题很简单,当 GOG 安装程序安装游戏时,它们会在游戏目录中创建快捷方式,并在开始菜单中创建快捷方式。所有这些快捷方式都使用安装目录中的图标文件,我之前说过这些文件已被删除。

每次安装游戏时都会创建一个密钥,其中包含以下内容:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\UFH\SHC]
"224"=hex(7):43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,44,00,61,00,74,00,61,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,00,74,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,5c,00,53,00,74,00,61,00,72,00,74,00,20,00,4d,00,65,00,6e,00,75,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,73,00,5c,00,41,00,76,00,61,00,64,00,6f,00,6e,00,20,00,32,00,20,00,2d,00,20,00,54,00,68,00,65,00,20,00,43,00,6f,00,72,00,72,00,75,00,70,00,74,00,69,00,6f,00,6e,00,20,00,5b,00,47,00,4f,00,47,00,2e,00,63,00,6f,00,6d,00,5d,00,5c,00,41,00,76,00,61,00,64,00,6f,00,6e,00,20,00,32,00,20,00,2d,00,20,00,54,00,68,00,65,00,20,00,43,00,6f,00,72,00,72,00,75,00,70,00,74,00,69,00,6f,00,6e,00,2e,00,6c,00,6e,00,6b,00,00,00,44,00,3a,00,5c,00,47,00,61,00,6d,00,65,00,73,00,5c,00,41,00,76,00,61,00,64,00,6f,00,6e,00,20,00,32,00,5c,00,41,00,76,00,61,00,64,00,6f,00,6e,00,20,00,32,00,2e,00,65,00,78,00,65,00,00,00,00,00,00,00
  • 解码数据后,我们得到类似下面的内容;一个REG_MULTI_SZ包含两行的值,第一行是快捷方式文件,第二行是与之关联的可执行文件。由于我仍然不完全理解的原因,每当调用可执行文件时,快捷方式文件就会显示在任务栏中,并且由于注册表项的原因,它会覆盖可执行文件自己的图标:
    In [6]: bytearray(int(i, 16) for i in data.split(","))[::2].decode()
    Out[6]: 'C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Avadon 2 - The Corruption [GOG.com]\\Avadon 2 - The Corruption.lnk\x00D:\\Games\\Avadon 2\\Avadon 2.exe\x00\x00\x00'
    

我已经通过修改任务栏图标的图标文件来验证了这一点,这也修改了开始菜单中的快捷方式,并且删除开始菜单文件夹会恢复游戏可执行文件自己的图标。

可以查询此注册表项,循环遍历所有子项,查找数据的可执行路径是否与根游戏文件夹[D:/Games]匹配,如果匹配,则删除此项以及关联的开始菜单文件夹。

  • 我编写的解决该问题的 Python 程序:
    (我以前从未使用过winreg它,可以用 PowerShell 编写它,但这并不好玩,因为我不会通过这种方式学习新东西;我用 Python 编写了它,经过了严格的测试,它运行完美)
    import shutil
    import winreg
    from pathlib import Path
    
    HKCU = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
    UFH_SHC = winreg.OpenKey(
      HKCU, r"SOFTWARE\Microsoft\Windows\CurrentVersion\UFH\SHC", 0, winreg.KEY_ALL_ACCESS
    )
    
    def delete_GOG_shortcuts() -> None:
      num_values = winreg.QueryInfoKey(UFH_SHC)[1]
      names = []
      for i in range(num_values):
        name, data, _ = winreg.EnumValue(UFH_SHC, i)
        if "D:\\Games" in data[1]:
          folder = Path(data[0]).parent
          assert folder.name != "Programs"
          shutil.rmtree(folder, ignore_errors=True)
          names.append(name)
    
        for name in names:
          winreg.DeleteValue(UFH_SHC, name)
    

相关内容