Frage

Ich bin auf der Suche nach einer Möglichkeit, ein Symbol aus einer EXE-Datei mit Python zu extrahieren. Ich weiß, dass Sie win32gui die ExtractIconEx Funktion greifen auf das Symbol einer .exe, aber diese gibt einen HICON resource handle, die nicht gut verwenden kann, weil ich das Symbol mit PyQt malen wollen.

Auch das einzige Beispiel, das ich gesehen habe mit win32gui hat keine Transparenz und die Symbole sehen nicht glatt.

Was wäre der beste Weg, um dies zu tun mit Python & PyQt zu gehen?

- Bearbeiten -

Danke von Lukáš Lalinský dieses Problem zu helfen, jetzt, hier gelöst wird, ist der endgültige Code ist jemand sucht etwas ähnliches wie mir zu tun:

import sys
import win32ui
import win32gui
from PyQt4 import QtCore
from PyQt4 import QtGui

class testWindow(QtGui.QMainWindow):
    def __init__(self):
        super(testWindow, self).__init__()
        self.setGeometry(180.0, 130.0, 280.0, 400.0)
        self.setMouseTracking(True)

        large, small = win32gui.ExtractIconEx('C:\\Users\\Blank\\Apps\\Web Browsers\\Firefox\\Firefox.exe', 0)
        win32gui.DestroyIcon(small[0])

        self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)
    def bitmapFromHIcon(self, hIcon):
        hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
        hbmp = win32ui.CreateBitmap()
        hbmp.CreateCompatibleBitmap(hdc, 32, 32)
        hdc = hdc.CreateCompatibleDC()
        hdc.SelectObject(hbmp)
        hdc.DrawIcon((0, 0), hIcon)
        hdc.DeleteDC()
        return hbmp.GetHandle()
    def paintEvent(self, event):
        painter = QtGui.QPainter()
        painter.begin(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.NoPen)
        painter.setBrush(QtGui.QBrush(QtGui.QColor(255.0, 255.0, 255.0, 255.0), QtCore.Qt.SolidPattern))
        painter.drawRect(QtCore.QRect(0.0, 0.0, 280.0, 400.0))
        painter.drawPixmap(QtCore.QRect(0.0, 0.0, 32.0, 32.0), self.pixmap)
        painter.end()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mainWindow = testWindow()
    mainWindow.show()
    app.exec_()
War es hilfreich?

Lösung

Es gibt ein Verfahren QPixmap von einem HBITMAP zu schaffen, so das einzige Problem ist, wie HICON zu konvertieren HBITMAP. Dies kann mit GetIconInfo erfolgen.

icons = win32gui.ExtractIconEx('C:/Program Files/Internet Explorer/iexplore.exe', 0, 10)
info = win32gui.GetIconInfo(icons[0][0])
pixmap = QtGui.QPixmap.fromWinHBITMAP(info[4])
info[3].close()
info[4].close()
# call win32gui.DestroyIcon on all the icons returned by ExtractIconEx

EDIT: Dieser Code wird nicht mit Anti-Aliasing und Alpha-Kanal helfen. Ihr neuer Code ist fast richtig, aber Sie müssen Qt sagen, den Alpha-Kanal zu laden. Wenn Sie ersetzen:

self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]))

mit:

self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)

wird es das Richtige tun. Die „magische“ Zahl 2 sollte technisch QtGui.QPixmap.Alpha sein, aber aus irgendeinem Grund Qt bietet keine Konstante ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top