许多开发人员遇到使用 setWindowIcon
仅更改窗口左上角图标而未影响任务栏图标的问题。以下是解决方案,以及相关背景和步骤。
背景
在 Windows 7 中,任务栏图标关联的是“应用程序用户模型”,而不是单个应用程序窗口。Windows 会使用一些启发式方法来决定不同实例是否应该归属于同一个任务栏图标。例如,如果您有多个实例运行并且每个实例都有自己的图标,它们会被归属于单个任务栏图标。这也适用于所有由 pythonw.exe
托管的程序。因此,仅使用 setWindowIcon
改变窗口图标并不会影响任务栏图标。
解决方案
要正确设置任务栏图标,我们需要使用 Windows 的 API 明确定义应用程序的用户模型 ID(AppUserModelID)。这可以通过注册表配置,或者更简单地使用 Python 代码调用 Windows API。
方法
以下步骤展示了如何通过 ctypes
库在 Python 中设置 AppUserModelID,从而改变任务栏图标。
-
安装 PyQt4:
from PyQt4 import QtGui import ctypes
-
定义应用程序 ID 并设置任务栏图标:
# 定义 AppUserModelID myappid = u'mycompany.myproduct.subproduct.version' # 任意字符串# 调用 Windows API 设置当前进程的 AppUserModelID ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)# 创建应用程序和主窗口 app = QtGui.QApplication([]) mainwindow = QtGui.QMainWindow()# 设置窗口图标 app.setWindowIcon(QtGui.QIcon('chalk.ico')) mainwindow.setWindowIcon(QtGui.QIcon('chalk.ico')) mainwindow.show()# 运行应用程序主循环 app.exec_()
注意事项
- 必须在显示窗口前进行
SetCurrentProcessExplicitAppUserModelID
调用。 - 确保
myappid
是unicode
字符串。 - 如果需要进行跨平台兼容性检查,可以在调用
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID
前添加操作系统类型检测(例如通过os.name
)。