Icons (.ico) in Exe einbetten?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Icons (.ico) in Exe einbetten?

16 Jan 2017, 03:18

Hallöchen zusammen,

ich bin nach DIESEM THREAD vorgegangen, um Bilder in ein compiliertes Script einzubetten.
Das funktioniert auch prima.
Nun würde ich das selbe gern auch mit Icons machen, um diese später im Traymenü, bzw. in Contexrmenüs anzeigen zu lassen.
Ist das mit diesen Funktionen auch möglich?

Was müsste ich in

Code: Select all

    FOLDER_OPEN   := "Ordner öffnen"
    Menu, ORDNER, Add , %FOLDER_OPEN%     , FOLDER_OPEN
    Menu, ORDNER, Icon, %FOLDER_OPEN%     , gfx_klein\folder_open.ico  , 0, 32
ändern, damit das Icon nicht direkt von der Platte, sondern aus der späteren EXE Datei geladen wird?

Einfach

Code: Select all

 ... +0xE +%SS_REALSIZECONTROL%
anhängen, bzw. in die Zeile, wo das Icon geladen wird einbauen (ich weiß, das ist naiv -smile-), klappt nicht.

Dank Euch im Voraus,

Gucky.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

16 Jan 2017, 03:35

Moin,

zusammen mit der Funktion LoadPicture() wurde in AHK die Handle-Syntax u.a auch für Menüs eingeführt. Damit sollte etwas gehen, z.B.:

Code: Select all

Menu, ..., Icon, ..., HICON:%hicon%
FI_GetImage() arbeitet allerdings mit GDI+, und das stellt sich, wie ich inzwischen weiß, mit Icons nicht sonderlich geschickt an. Das Ergebnis mag deshalb abhängig von der Icon-Datei nicht wirklich überzeugend sein.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

16 Jan 2017, 03:45

Sag mal schläfst Du auch mal?
Sooo schnell, wie Du oft antwortest... (lach)

Lieben Dank.

Ich war inzwischen auch auf Suche und habe [url=https://autohotkey.com/boards/viewtopic.php?f=11&t=2101]DAS HIER[/gefunden].
Da ich in ein Script neben Icons auch gerne einen Font einfügen würde, um diesen nicht zwangweise intstallieren zu müssen, könnte das für mich ggf. auch interessant sein (? - Frage)
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

16 Jan 2017, 04:18

Das Problem ist, wie man aus der inkludierten Datei etwas macht, mit dem die Windows-API-Funktionen (die ja auch von AHK aufgerufen werden) etwas anfangen können. Es wäre z.B. im Fall der Icons besser, sie als Icon-Ressourcen einzubinden. Dann wäre der Umweg über FI_GetImage() nicht nötig. Leider tut das FileInstall aber nicht, alle Dateien werden als Typ 'RC_DATA' (Daten beliebigen Inhalts) eingebunden. Und für Fonts habe bisher keine 'Konverterfunktion'.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

18 Jan 2017, 12:53

Ich verstehe die Sache mit den "Nandles" nicht so richtig, befürchte ich.

Wenn ich mit der o.g. Methose z.B. Bilder in die spätere Exe einbaue, sieht mein Code etwa so aus:

Code: Select all

    if (A_IsCompiled)
        Gui, Main: Add  , Picture    , x300 y10 vBTN_MIN gGuiMinimize     hwndHPIC101       +BackgroundTrans -Border +0x4000000 +0xE +%SS_REALSIZECONTROL%

    else
        Gui, Main: Add  , Picture    , x300 y10 vBTN_MIN gGuiMinimize   +BackgroundTrans -Border +0x4000000, gfx_klein\btn_min2.png


    Image101 := FI_GetResource("gfx_klein\btn_min2.png")
    HIMG101  := FI_GetImage(Image101)
    SetImage(HPIC101, HIMG101)

    ...
    ...
    ...

; Am Ende des Scriptes kommen dann noch die beiden Funktionen zum Einlesen der Bilder
FI_GetResource(ResName)

; ... und 

FI_GetImage(ImgRes, ImgType := 0)

;... sowie

    FileInstall, gfx_klein\btn_min2.png, gfx_klein\btn_min2.png
Was ich nicht verstehe ist folgendes:
Um ein Handle zu bekommen, muss ich ein Bild zunächst z.B. in ein GUI einbauen (oder nicht?)
Das mache ich mit GUI, Add... (siehe oben).
Um nun ein Icon einzubetten, würde es demnach reichen, dieses z.B. als PNG Bild zu speichern (ist mir eh lieber als Icons) und es dann mit...

Code: Select all

    IconPic101 := FI_GetResource("gfx_klein\btn_min2.png")
    HIMG101  := FI_GetImage(IconPic101)
    SetImage(HPIC101, HIMG101)
... ins Script einzubauen, um es dann im Contextmenu mit...

Code: Select all

[code]
Menu, ..., Icon, ..., HICON:%IconPic101%
... im Menü anzuzeigen?

Oder komme ich auf einfacherem Weg an das Handle für ein Bild?
Ich muss zugeben, dass ich diese Funktionen benutze, "wie sie sind", ohne wirklich zu verstehen, was da eigentlich genau passiert (smile).

Grüße,

Gucky.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

18 Jan 2017, 13:02

Ich hab jetzt mal eben ein kleines Script gebaut, um es zu testen.
in compilierter Form erhalte ich den Fehler: Can´t load Icon.

Code: Select all

#NoEnv
    Gui, Main: Add  , ListView   , x10 y10 w620 h380  vTABELLE gSHOWMENU -LV0x10 +LV0x3 +LV0x1 -LV0x1000  -Multi +AltSubmit +readonly +cFFFFCC +Background3D3F40 Grid , Test1|Test2|Test3 




Gui, Main: Show, w640 y400, TEST
Gui, Main: +LastFound
Gui, Main: Default


FOLDER_OPEN      := "Ordner öffnen"
Menu, ORDNER, Add , %FOLDER_OPEN%         , FOLDER_OPEN
If (A_IsCompiled)
    Menu, ORDNER, Icon, %FOLDER_OPEN%     , HICON:%HIMG101%
else
    Menu, ORDNER, Icon, %FOLDER_OPEN%     , gfx_klein\test.ico, 0, 32

Image101 := FI_GetResource("test.png")
HIMG101  := FI_GetImage(Image101)
SetImage(HPIC101, HIMG101)
    

Gui, Main: Treeview, PLU_BERICHTE
LV_DELETE()
LV_ADD( "", "111", "AAA", "aaa")
LV_ADD( "", "222", "BBB", "bbb")
LV_ADD( "", "333", "CCC", "bbb")
Return



FOLDER_OPEN:
   msgbox Klappt
Return



MainGuiClose:
  ExitApp
Return



SHOWMENU:
If (A_GuiEvent = "RightClick")
{
    Menu,ORDNER, Show
}
Return

SetImage(HWND, HIMG)
{
    SendMessage, 0x172, 0, HIMG, , ahk_id %HWND%
    Return (ErrorLevel = "FAIL" ? 0 : ErrorLevel)
}

FI_GetResource(ResName)
{
    If !(A_IsCompiled)
        Return False
    
    If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", 10, "UPtr")) && (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
        Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr"), Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}
  
    Return False
}

FI_GetImage(ImgRes, ImgType := 0)
{
    If !(A_IsCompiled)
        Return False
  
    If !IsObject(ImgRes) || (ImgRes.Ptr = "") || (ImgRes.Size = "")
        Return False
  
    GlData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", ImgRes.Size, "UPtr")
    Data := DllCall("Kernel32.dll\GlobalLock", "Ptr", GlData, "UPtr")
    DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Data, "Ptr", ImgRes.Ptr, "UPtr", ImgRes.Size)
    DllCall("Kernel32.dll\GlobalUnlock", "Ptr", GlData )
    DllCall( "Ole32.dll\CreateStreamOnHGlobal", "Ptr", GlData, "Int", True, "PtrP", Stream)
    GdipHMod := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
    VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
    DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", GdipToken, "Ptr", &SI, "Ptr", 0)
    DllCall("Gdiplus.dll\GdipCreateBitmapFromStream",  "Ptr", Stream, "PtrP", Bitmap)
    If (ImgType = 0)
        DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
    Else
        DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)    
    DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", Bitmap )
    DllCall("Gdiplus.dll\GdiplusShutdown",  "Ptr", GdipToken )
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", GdipHMod)
    DllCall(NumGet(NumGet(Stream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", Stream)
    DllCall("Kernel32.dll\GlobalFree", "Ptr", GlData, "UPtr")
    Return Image
}


FileInstall, gfx_klein\test.png  , gfx_klein\test.png
Was muss ich ändern, damit es mit einem PNG Bild klappt?

Dank Euch,

Gucky.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

19 Jan 2017, 05:04

Moin Gucky,

PNG-Dateien an sich sind keine Icon-Dateien. Es gibt zwar seit Win Vista auch PNG Icons, die stecken aber in ICO-Dateien mit einem anderen internen Aufbau.

Die Funktion FI_GetImage(Image101) erstellt so aufgerufen ein Bitmap-Handle (HBITMAP). Versuch mal:

Code: Select all

#NoEnv
If (A_IsCompiled) { ; das Laden muss nach vorn
    Image101 := FI_GetResource("test.png")
    HIMG101  := FI_GetImage(Image101)
}

FOLDER_OPEN      := "Ordner öffnen"
Menu, ORDNER, Add , %FOLDER_OPEN%         , FOLDER_OPEN
If (A_IsCompiled)
    Menu, ORDNER, Icon, %FOLDER_OPEN%     , HBITMAP:%HIMG101% ; HICON <> HBITMAP
Else
    Menu, ORDNER, Icon, %FOLDER_OPEN%     , gfx_klein\test.ico, 0, 32

Gui, Main: Default
Gui, Main: +LastFound
Gui, Main: Add, ListView, x10 y10 w620 h380 vTABELLE gSHOWMENU -LV0x10 +LV0x3 +LV0x1 -LV0x1000 -Multi +AltSubmit +readonly +cFFFFCC +Background3D3F40 Grid , Test1|Test2|Test3
LV_Delete()
LV_Add( "", "111", "AAA", "aaa")
LV_Add( "", "222", "BBB", "bbb")
LV_Add( "", "333", "CCC", "bbb")
Gui, Main: Show, w640 y400, TEST
Return

FOLDER_OPEN:
   msgbox Klappt
Return

MainGuiClose:
  ExitApp
Return

MainGuiContextMenu:
If (A_GuiEvent = "RightClick")
{
    Menu, ORDNER, Show
}
Return

SetImage(HWND, HIMG)
{
    SendMessage, 0x172, 0, HIMG, , ahk_id %HWND%
    Return (ErrorLevel = "FAIL" ? 0 : ErrorLevel)
}

FI_GetResource(ResName)
{
    If !(A_IsCompiled)
        Return False

    If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", 10, "UPtr")) && (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
        Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr"), Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}

    Return False
}

FI_GetImage(ImgRes, ImgType := 0)
{
    If !(A_IsCompiled)
        Return False

    If !IsObject(ImgRes) || (ImgRes.Ptr = "") || (ImgRes.Size = "")
        Return False

    GlData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", ImgRes.Size, "UPtr")
    Data := DllCall("Kernel32.dll\GlobalLock", "Ptr", GlData, "UPtr")
    DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Data, "Ptr", ImgRes.Ptr, "UPtr", ImgRes.Size)
    DllCall("Kernel32.dll\GlobalUnlock", "Ptr", GlData )
    DllCall( "Ole32.dll\CreateStreamOnHGlobal", "Ptr", GlData, "Int", True, "PtrP", Stream)
    GdipHMod := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
    VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
    DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", GdipToken, "Ptr", &SI, "Ptr", 0)
    DllCall("Gdiplus.dll\GdipCreateBitmapFromStream",  "Ptr", Stream, "PtrP", Bitmap)
    If (ImgType = 0)
        DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
    Else
        DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
    DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", Bitmap )
    DllCall("Gdiplus.dll\GdiplusShutdown",  "Ptr", GdipToken )
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", GdipHMod)
    DllCall(NumGet(NumGet(Stream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", Stream)
    DllCall("Kernel32.dll\GlobalFree", "Ptr", GlData, "UPtr")
    Return Image
}

FileInstall, gfx_klein\test.png  , gfx_klein\test.png
*nicht getestet*
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

19 Jan 2017, 05:17

Huhu,

lieben Dank für Deine flotte Hilfe.
Ich weiß natürlich, dass PNG keine ICO Dateien sind - Klarer Fall.
Das war darauf bezogen, dass ich Bilder für GUIs an sich immer im PNG Format speichere (für etwaige Änderungen, etc.).
Dies gilt auch für Icons, die ich dann zusätzlich noch als ICO speichere.

Wenn das klappt, was Du schriebst, brauche ich künftig keine Icon Dateien mehr und kann alles in PNG belassen und mit in die EXE einflechten.

Ich schau´s mir heut Abend an und melde mich, ob es klappt.

Nochmals Dankeschön,

Gucky.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

19 Jan 2017, 05:21

... noch eine Änderung. Der Name für FI_GetResource() muss natürlich der Name aus FileInstall sein: "gfx_klein\test.png"
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

19 Jan 2017, 05:26

Ist klar, war mir schon aufgefallen, ist aber kein Problem.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

20 Jan 2017, 03:57

Huhu zusammen,

ich hab das jetzt mal getestet und das Einbetten klappt auf diesem Weg.
Ein kleiner Pferdefuß bleibt allerdings noch, denn wie auf dem Screenshot zu sehen ist,
ist das Icon nicht (mehr) transparent. Ich habe es mit einer ICO und einer PNG Datei
getestet, die beide einen transparenten Hintergrund haben. Sowohl im compilierten, als
auch im uncompilierten Script wird der Hintergrund jedoch schwarz dargestellt.

Das wäre nun kein Thema, denn ich könnte das bei den Bildern ja leicht ändern.

Allerdings ist mir in der Sub 'FI_GetResource' etwas aufgefallen...

Code: Select all

FI_GetResource(ResName, ResType := 10)  ;  <<== ???
{
    ; RT_RCDATA := 10 ;Fileinstall is always 10
    If !(A_IsCompiled)
        Return False
   
    If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", ResType, "UPtr"))
       && (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
       Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr")
       , Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}
   
   Return False
}
Gleich in der 1. Zeile heißt es 'FI_GetResource(ResName, ResType := 10)'
Kann ich mit 'ResType' vielleicht was einstellen?
Ich hab da mal 0 und 1 probiert, aber es verändert sich nichts am Ergebnis.


Ähnlich ist es in der Sub 'FI_GetImage(ImgRes, ImgType := 0)'
Da steht 'ImgType' am Ende.
Nun, in der Sub steht dann...

Code: Select all

    If (ImgType = 0)
        DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
    Else
        DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)


Dies bedeutet, dass im Falle ImgType = 0 ein Bitmap erzeugt wird, andernfalls ein Icon.
Dann müsste doch demnach, wenn ich dort eine 0 setze oder nichts übergebe, ein Bitmap, also Bild erzeugt werden.

Gucky.
Attachments
1.png
Screenshot_Icon
1.png (10.05 KiB) Viewed 4764 times
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

20 Jan 2017, 04:49

Moin,
Gleich in der 1. Zeile heißt es 'FI_GetResource(ResName, ResType := 10)'
Kann ich mit 'ResType' vielleicht was einstellen?
FileInstall bettet die Ressourcen als Typ 10 (RC_DATA) ein. Solange der Name eindeutig ist, wird die Ressource aber auch gefunden, wenn Du 0 übergibst. Der Parameter ResType ist also eigenlich überflüssig und ist wohl beim Umschreiben der Funktion für FileInstall stehen geblieben.
Dies bedeutet, dass im Falle ImgType = 0 ein Bitmap erzeugt wird, andernfalls ein Icon.
Dann müsste doch demnach, wenn ich dort eine 0 setze oder nichts übergebe, ein Bitmap, also Bild erzeugt werden.
Korrekt.
Der DllCall für GdipCreateHICONFromBitmap ist allerdings - wie ich gerade sehe - so nicht korrekt. Es müsste

Code: Select all

DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image)
sein.

Die Transparenz ist wirklich ein Problem, für das ich keine fertige Lösung habe.
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

20 Jan 2017, 04:52

... Du könntest auch mal folgende Änderung probieren:

Code: Select all

    If (ImgType = 0)
        DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0x00FFFFFF)
Das könnte in einigen Fällen ein besseres Ergebnis liefern.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Icons (.ico) in Exe einbetten?

20 Jan 2017, 07:33

Besagtes Verhalten tritt bei mir nicht auf.
Bist du dir sicher, dass du bei deinem Bildern die Transparenzen korrekt gesetzt hast?

Code: Select all

GUI,New
Gui,Color,00FF00
If false
	FileInstall,Test.png,-
Menu,m1,ADD,  PerDateiGeladen
Menu,m1,ADD,  UeberFileInstall
Menu,m1,Icon, PerDateiGeladen, Test.png,, 0
Menu,m1,Icon, UeberFileInstall, % "HBITMAP:" . FI_GetImage( FI_GetResource("Test.png") ),, 0
Gui, Menu, m1
GUi,Show, w1900 h1000
return
PerDateiGeladen:
UeberFileInstall:
ExitApp


FI_GetImage(ImgRes, ImgType := 0) {
   If !(A_IsCompiled)
      Return False
   If !IsObject(ImgRes) || (ImgRes.Ptr = "") || (ImgRes.Size = "")
      Return False
   GlData := DllCall("Kernel32.dll\GlobalAlloc", "UInt", 2, "UPtr", ImgRes.Size, "UPtr")
   Data := DllCall("Kernel32.dll\GlobalLock", "Ptr", GlData, "UPtr")
   DllCall("Kernel32.dll\RtlMoveMemory", "Ptr", Data, "Ptr", ImgRes.Ptr, "UPtr", ImgRes.Size)
   DllCall("Kernel32.dll\GlobalUnlock", "Ptr", GlData )
   DllCall( "Ole32.dll\CreateStreamOnHGlobal", "Ptr", GlData, "Int", True, "PtrP", Stream)
   GdipHMod := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll", "UPtr")
   VarSetCapacity(SI, 16, 0), NumPut(1, SI, 0, "UChar")
   DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", GdipToken, "Ptr", &SI, "Ptr", 0)
   DllCall("Gdiplus.dll\GdipCreateBitmapFromStream",  "Ptr", Stream, "PtrP", Bitmap)
   If (ImgType = 0)
      DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)
   Else
      DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", Bitmap, "PtrP", Image, "UInt", 0)    
   DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", Bitmap )
   DllCall("Gdiplus.dll\GdiplusShutdown",  "Ptr", GdipToken )
   DllCall("Kernel32.dll\FreeLibrary", "Ptr", GdipHMod)
   DllCall(NumGet(NumGet(Stream + 0, 0, "UPtr") + (A_PtrSize * 2), 0, "UPtr"), "Ptr", Stream) ; Stream::Release
   DllCall("Kernel32.dll\GlobalFree", "Ptr", GlData, "UPtr")
   Return Image
}

FI_GetResource(ResName) {
   If !(A_IsCompiled)
      Return False
   If (HRSRC := DllCall("Kernel32.dll\FindResource", "Ptr", 0, "Str", ResName, "Ptr", 10, "UPtr"))
   && (HRES := DllCall("Kernel32.dll\LoadResource", "Ptr", 0, "Ptr", HRSRC, "UPtr"))
      Return {Ptr: DllCall("Kernel32.dll\LockResource", "Ptr", HRES, "UPtr")
            , Size: DllCall("Kernel32.dll\SizeofResource", "Ptr", 0, "Ptr", HRSRC, "UInt")}
   Return False
}
Recommends AHK Studio
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Icons (.ico) in Exe einbetten?

21 Jan 2017, 10:37

Huhu,

ja, da bin ich sicher, denn...

1) erstelle ich grundsätzlich PNG Bilder im 32 Bit Modus (also mit Transparenz)
2) werden die Bilder in der NICHT compilierten Version (also als Script) korrekt angezeigt.
3) Schrieb justme: "Die Transparenzen sind wirklich ein Problem", er scheint das also auch zu haben.

@ justme:
Das werde ich mir anschauen und ausprobieren. Wie gesagt, es ist kein Problem, da ich zur Not einfach die Hintergrundfarbe der Contextmenüs als Hintergrundfarbe bei den Bildern benutze.
Kommt also der Berg nicht zum Propheten... (lacht)
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Icons (.ico) in Exe einbetten?

24 Jan 2017, 09:04

Werd mal den Thread kurz hijacken (kann ja ggf dann verschieben).

Habe probleme mit Menu, Tray, Icon, HICON das Tray zu ändern...

Code: Select all

; GLOBAL SETTINGS ===============================================================================================================

#NoEnv
#SingleInstance Force
#Persistent

SetBatchLines, -1

hIcon01 := LoadPicture("test.ico")

SetTimer, DO_IT, % 2000
return

; CRONJOB =======================================================================================================================

DO_IT:
    ;Menu, Tray, Icon,, HICON:%hIcon01%, 1                              ; <- keine sichtbare Änderung
    ;Menu, Tray, Icon, HICON:%hIcon01%,, 1                              ; <- Error: Can't load icon. (Specifically: HICON:-33219225)
    ;Menu, Tray, Icon, C:\Windows\system32\actioncentercpl.dll, 2, 1    ; <- funktioniert
return

; INCLUDES ======================================================================================================================

;FileInstall, test.ico, test.ico                                        ; <- soll später via FileInstall in der Exe hinterlegt werden

; ===============================================================================================================================
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

24 Jan 2017, 09:36

Moin,

wie ich das sehe, musst Du der Funktion den Parameter ImageType mitgeben, wenn Du etwas anderes als ein HBITMAP Handle haben willst.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Icons (.ico) in Exe einbetten?

24 Jan 2017, 09:45

Danke schon mal.
Wenn die Bilder nach dem kompilieren noch im Ordner sind, läuft es.
Mit FileInstall + Kompilieren aber ohne Bilder im Ordner der .exe funktioniert das nicht. -> hIcon = 0

Code: Select all

; GLOBAL SETTINGS ===============================================================================================================

#NoEnv
#SingleInstance Force
#Persistent

SetBatchLines, -1

hIcon01 := LoadPicture("test.ico",, IMAGE_ICON)

SetTimer, DO_IT, % 2000
return

; CRONJOB =======================================================================================================================

DO_IT:
    Menu, Tray, Icon, HICON:*%hIcon01%,, 1
return

; INCLUDES ======================================================================================================================

FileInstall, test.ico, test.ico
;FileInstall, test.ico, %A_WorkingDir%\test.ico

; ===============================================================================================================================
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Icons (.ico) in Exe einbetten?

24 Jan 2017, 10:19

Ich verstehe nicht, was Du da versuchen willst. LoadPicture() braucht eine Datei. Dein FileInstall wird aber nicht ausgeführt.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Icons (.ico) in Exe einbetten?

25 Jan 2017, 01:31

Habs jetzt mit deiner Funktion gemacht hIcon01 := FI_GetImage(FI_GetResource("test.ico"), 1)

Naja.. Ich hatte gehofft, mit LoadPicture() auf die durch FileInstall (durch kompilieren) in der exe hinterlegten ressource (hier ein icon) zugreifen zu können (ohne wieder zu entpacken)...
Wäre zu schön, wenn LoadPicture() das von Hause aus unterstützen würde..
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 29 guests