web-dev-qa-db-ja.com

Windows 7でアプリケーションのタスクバーアイコンを設定する方法

PyQt4でアプリケーションのタスクバーアイコンを設定するにはどうすればよいですか?

私はsetWindowIconを試しましたが、メインウィンドウの左上にアイコンを正常に設定しましたが、Windows 7のタスクバーに表示されるアイコンには影響しません-タスクバーアイコンはデフォルトのままですPython pywアイコン。これが私のコードです:

_from PyQt4 import QtGui

app = QtGui.QApplication([])
mainwindow = QtGui.QMainWindow()
mainwindow.show()

app.setWindowIcon(QtGui.QIcon('chalk.ico'))
mainwindow.setWindowIcon(QtGui.QIcon('chalk.ico'))
app.exec_()
_

[更新] setWindowIcon()の前にshow()を配置してみました。私は他の画像、icoとpngでそれを試しました。何も役に立ちません。

41
DamonJW

少し掘り下げた後、私は答えを見つけました。

Windows 7では、タスクバーは「アプリケーションウィンドウ」自体ではなく、「アプリケーションユーザーモデル」用です。たとえば、アプリケーションの複数の異なるインスタンスを実行していて、各インスタンスに独自のアイコンがある場合、それらはすべて1つのタスクバーアイコンの下にグループ化されます。 Windowsはさまざまなヒューリスティックを使用して、異なるインスタンスをグループ化する必要があるかどうかを決定します。この場合、Pythonw.exeによってホストされているすべてのものをPythonw.exeのアイコンの下にグループ化する必要があると決定しました。

正しい解決策は、Pythonw.exeが他のアプリケーションをホストしているだけであることをWindowsに伝えることです。おそらく、Pythonの将来のリリースでこれが可能になります。あるいは、レジストリキーを追加して、Pythonw.exeがアプリケーションではなく単なるホストであることをWindowsに通知できます。MSDNのドキュメントを参照してください。 AppUserModelIDs の場合。

または、PythonからのWindows呼び出しを使用して、このプロセスに適切なAppUserModelIDが何であるかを明示的にWindowsに伝えることができます。

import ctypes
myappid = 'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.Shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

編集:Ronanの答えを見てください:myappid文字列はユニコードでなければなりません。

95
DamonJW

@DamonJWの答えは機能しますが、マイナーな問題があります。myappidはUnicodeである必要があります(引数のタイプはPCWSTRです)。

import ctypes
myappid = u'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.Shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

そうしないと、AppUserModelIDを取得すると、間違ったUnicode文字(祭潣灭湡⹹祭牰摯捵⹴畳灢潲畤瑣瘮牥楳湯):

import ctypes
from ctypes import wintypes
lpBuffer = wintypes.LPWSTR()
AppUserModelID = ctypes.windll.Shell32.GetCurrentProcessExplicitAppUserModelID
AppUserModelID(ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR))
appid = lpBuffer.value
ctypes.windll.kernel32.LocalFree(lpBuffer)
if appid is not None:
    print(appid)

とは言っても、WindowsはUnicode文字列を「別のプロセス」として認識し、それに応じてアイコンを切り替えるため、これは些細なことです。

8
Ronan Paixão

アプリがGUIを表示する前に、AppUserModelIDを設定する必要があります。他のWindows 7機能にアクセスする必要がある場合は、PyQtバインディングを備えたWindows 7用のQtアドオンである Q7Goodies を参照してください。

4
torn