Icon aus *.exe auslesen und mit GDI+ auf die GUI zeichnen

  • Schönen Nachmittag. ;)

    Die Überschrift sagt ja eigentlich schon alles, aber ich erklär das Problem nochmal:
    Ich habe eine *.exe Datei, von der ich das Icon extrahieren will, und es anschließend mit GDI+ in eine GUI zeichnen will.

    Und ich finde einfach keine Lösung für das Problem, und hoffe ihr könnt mir hierbei helfen.

    Danke schonmal im Voraus.


    MfG,
    h2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • entweder du nimmst die Funktion PickIconDlg (msdn) oder du nimmst aus der WinApi die Funktion _WinApi_ExtractIcon und die GDIP.au3 Funktion um das HICON in eine Bitmap zu verwandeln (nur falls du dir selebr die Mühe amchen willst :P)

  • Wie schon gesagt geht die Transparenz beim Umwandeln zu GDI+ verloren

    Zeichne die Icons am besten mit _WinAPI_DrawIconEx:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hIcon = _WinAPI_PrivateExtractIcon(@SystemDir & "\calc.exe", 0, 256, 256)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate("Test", 256, 256)
    GUISetBkColor(0x00AA00)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $hDC = _WinAPI_GetDC($hGui)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_DrawIconEx($hDC, 0, 0, $hIcon, 256, 256)

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_DestroyIcon($hIcon)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _WinAPI_PrivateExtractIcon($sIcon, $iIndex, $iWidth, $iHeight)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hIcon, $tIcon = DllStructCreate('hwnd'), $tID = DllStructCreate('hwnd')
    Local $Ret = DllCall('user32.dll', 'int', 'PrivateExtractIcons', 'str', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr', DllStructGetPtr($tIcon), 'ptr', DllStructGetPtr($tID), 'int', 1, 'int', 0)

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or ($Ret[0] = 0) Then
    Return SetError(1, 0, 0)
    EndIf
    $hIcon = DllStructGetData($tIcon, 1)
    If ($hIcon = Ptr(0)) Or (Not IsPtr($hIcon)) Then
    Return SetError(1, 0, 0)
    EndIf
    Return $hIcon
    EndFunc ;==>_WinAPI_PrivateExtractIcon

    [/autoit]
  • Danke für die vielen Antworten.
    Da ich es jetzt mal selbst probiert habe, komme ich leider zum selben Ergebniss wie UEZ.

    Beim umwandeln in GDI+ geht die ganze transparents verlorern. :/

    [autoit]

    Func _GDIPlus_ConvertIcon($mPath)
    Local $Icon, $Ret
    $Icon = _WinAPI_PrivateExtractIcon($mPath, 0, 256, 256)
    $Ret = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromHICON", "ptr", $Icon, "int*", 0)

    [/autoit][autoit][/autoit][autoit]

    Return $Ret[2]
    EndFunc

    [/autoit]

    Gibt es nicht irgendwo eine Funktion, die hier Abhilfe schaffen kann? :(

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%