Gdip Convert Base64 to PNG Topic is solved

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Gdip Convert Base64 to PNG

17 Apr 2021, 00:37

Hello! I am Russian. My English is poor
There is the following code:::

Code: Select all


; Code from http://www.autohotkey.com/board/topic/80924-make-windows-background-transparent-but-not-its-content/?p=514404
#SingleInstance, Force
#NoEnv
detecthiddenwindows on
SetBatchLines, -1

onexit exit_

#include gdip.ahk    ;download http://www.autohotkey.com/forum/topic32238.html 

If !pToken := Gdip_Startup()
{
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}


Gui, 1:  -Caption +E0x80000 +LastFound +OwnDialogs +Owner +alwaysontop
Gui, 1: Show, NA
gui +lastfound
hwnd := WinExist()


sFile=%a_scriptdir%\BG.bmp

pBitmap:=Gdip_CreateBitmapFromFile(sFile)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)


Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(hwnd, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)

OnMessage(0x201, "WM_LBUTTONDOWN")
return



WM_LBUTTONDOWN()
{
	PostMessage, 0xA1, 2
}


esc::
exit_:
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(pGraphics)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
ExitApp
This code displays Png as a GUI with a transparent background.
How to achieve the same result with Base64 image data?

Base64 image data:

Code: Select all

  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
Help me pls

roughly how it works when directly uploading a png file

Image[Mod edit: Image fixed.]
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

18 Apr 2021, 00:55

And how to add Base64 from text format to this script:

Code: Select all

LoadPictureToBuffer: ; creates Binary buffer with PNG image sized 164x65 ( 1725 bytes )
hex=
( Join
  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
) 

Screenshot is not what I need
And does this method preserve the Alpha channel?
User avatar
Smile_
Posts: 857
Joined: 03 May 2020, 00:51

Re: Gdip Convert Base64 to PNG

18 Apr 2021, 03:38

@SKAN Base64Dec(ByRef B64, ByRef Bin) function : In Here

Code: Select all

#include Gdip.ahk
If !pToken := Gdip_Startup()
{
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
}
Base64ImageData := "
( LTrim Join
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
)"

nBytes := Base64Dec(Base64ImageData, Bin)

File := FileOpen(sFile := "Decoded.png", "w")
File.RawWrite(Bin, nBytes)
File.Close()

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +Owner +Alwaysontop
Gui, 1: Show, NA

pBitmap:=Gdip_CreateBitmapFromFile(sFile)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

WM_LBUTTONDOWN()
{
    PostMessage, 0xA1, 2
}

Base64Dec(ByRef B64, ByRef Bin) { ; By SKAN / 18-Aug-2017
    Local Rqd := 0, BLen := StrLen(B64) ; CRYPT_STRING_BASE64 := 0x1
    DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
    , "UInt",0, "UIntP",Rqd, "Int",0, "Int",0 )
    VarSetCapacity( Bin, 128 ), VarSetCapacity( Bin, 0 ), VarSetCapacity( Bin, Rqd, 0 )
    DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
    , "Ptr",&Bin, "UIntP",Rqd, "Int",0, "Int",0 )
    Return Rqd
}
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Gdip Convert Base64 to PNG  Topic is solved

18 Apr 2021, 05:13

Found this in my copy of this Gdip_All.ahk:

Code: Select all

;#####################################################################################
; Function:        Gdip_BitmapFromBase64
; Description:     Creates a bitmap from a Base64 encoded string
;
; Base64           ByRef variable. Base64 encoded string. Immutable, ByRef to avoid performance overhead
;                  of passing long strings.
;
; return           If the function succeeds, the return value is a pointer to a bitmap, otherwise:
;                 -1 = Could not calculate the length of the required buffer
;                 -2 = Could not decode the Base64 encoded string
;                 -3 = Could not create a memory stream
Gdip_BitmapFromBase64(ByRef Base64) {
   pBitmap := 0
   DecLen := 0
   ; calculate the length of the buffer needed
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -1
   VarSetCapacity(Dec, DecLen, 0)
   ; decode the Base64 encoded string
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -2
   ; create a memory stream
   If !(pStream := DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"))
      Return -3
   DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", pStream, "PtrP", pBitmap)
   ObjRelease(pStream)
   Return pBitmap
}
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

19 Apr 2021, 00:51

Smile_ wrote:
18 Apr 2021, 03:38
@SKAN Base64Dec(ByRef B64, ByRef Bin) function : In Here

Code: Select all

#include Gdip.ahk
If !pToken := Gdip_Startup()
{
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
}
Base64ImageData := "
( LTrim Join
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
)"

nBytes := Base64Dec(Base64ImageData, Bin)

File := FileOpen(sFile := "Decoded.png", "w")
File.RawWrite(Bin, nBytes)
File.Close()

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +Owner +Alwaysontop
Gui, 1: Show, NA

pBitmap:=Gdip_CreateBitmapFromFile(sFile)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

WM_LBUTTONDOWN()
{
    PostMessage, 0xA1, 2
}

Base64Dec(ByRef B64, ByRef Bin) { ; By SKAN / 18-Aug-2017
    Local Rqd := 0, BLen := StrLen(B64) ; CRYPT_STRING_BASE64 := 0x1
    DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
    , "UInt",0, "UIntP",Rqd, "Int",0, "Int",0 )
    VarSetCapacity( Bin, 128 ), VarSetCapacity( Bin, 0 ), VarSetCapacity( Bin, Rqd, 0 )
    DllCall( "Crypt32.dll\CryptStringToBinary", "Str",B64, "UInt",BLen, "UInt",0x1
    , "Ptr",&Bin, "UIntP",Rqd, "Int",0, "Int",0 )
    Return Rqd
}
Is it possible to send data directly without saving a picture in png?
User avatar
Smile_
Posts: 857
Joined: 03 May 2020, 00:51

Re: Gdip Convert Base64 to PNG

19 Apr 2021, 01:44

That is what @just me mentioned.
Here is an example

Code: Select all

#include Gdip.ahk
If !pToken := Gdip_Startup()
{
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
}
Base64ImageData := "
( LTrim Join
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
)"

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +Owner +Alwaysontop
Gui, 1: Show, NA

pBitmap:=Gdip_BitmapFromBase64(Base64ImageData)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

WM_LBUTTONDOWN()
{
    PostMessage, 0xA1, 2
}

Gdip_BitmapFromBase64(ByRef Base64) {
   pBitmap := 0
   DecLen := 0
   ; calculate the length of the buffer needed
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -1
   VarSetCapacity(Dec, DecLen, 0)
   ; decode the Base64 encoded string
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -2
   ; create a memory stream
   If !(pStream := DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"))
      Return -3
   DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", pStream, "PtrP", pBitmap)
   ObjRelease(pStream)
   Return pBitmap
}
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

19 Apr 2021, 02:40

Smile_ wrote:
19 Apr 2021, 01:44
That is what @just me mentioned.
Here is an example

Code: Select all

#include Gdip.ahk
If !pToken := Gdip_Startup()
{
    MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
    ExitApp
}
Base64ImageData := "
( LTrim Join
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
)"

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +Owner +Alwaysontop
Gui, 1: Show, NA

pBitmap:=Gdip_BitmapFromBase64(Base64ImageData)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)
OnMessage(0x201, "WM_LBUTTONDOWN")
Return

WM_LBUTTONDOWN()
{
    PostMessage, 0xA1, 2
}

Gdip_BitmapFromBase64(ByRef Base64) {
   pBitmap := 0
   DecLen := 0
   ; calculate the length of the buffer needed
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -1
   VarSetCapacity(Dec, DecLen, 0)
   ; decode the Base64 encoded string
   If !DllCall("crypt32\CryptStringToBinary"
             , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
      Return -2
   ; create a memory stream
   If !(pStream := DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"))
      Return -3
   DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", pStream, "PtrP", pBitmap)
   ObjRelease(pStream)
   Return pBitmap
}
Thank you!
This solves my problem.

On Russian-speaking forums, I was sent to learn the basics, without any examples, but thanks to you, I can understand the basics much faster.
Thanks again!
User avatar
Smile_
Posts: 857
Joined: 03 May 2020, 00:51

Re: Gdip Convert Base64 to PNG

19 Apr 2021, 02:40

@bapl
Don't accept my answer, accept @just me one.
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

20 Apr 2021, 07:28

I thought this solves my problem, but by solving this it creates another one ..

Now I cannot add buttons, images, text here.
User avatar
Smile_
Posts: 857
Joined: 03 May 2020, 00:51

Re: Gdip Convert Base64 to PNG

20 Apr 2021, 13:59

Here is an approach:

Code: Select all

#Include, Class_Dock.ahk
#Include Gdip_All.ahk
If !pToken := Gdip_Startup()
{
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}
Base64ImageData := "
( LTrim Join
iVBORw0KGgoAAAANSUhEUgAAAMAAAACwCAYAAABZ/mHGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPOUlEQVR4nO2de6gcVx3HPzO7
yW2S5tFGqzQSjbEJPrt9sNWAEHCF6B+Clf6hIgWrQonUB4gWBBGEKhQfxdI/NEIRq1BsQf+JONKCUG+X23Tqk1bT2mDSPJo0r5vk
3rs74x9nzt2zk9177+6ceew9vw/Z7Oze3TO/nfl9z++c35wzx2MIjWYrHvY3QZg0wnbgDXr/qjfF8YXVTFoIfS/E+QUXMEWwuCHO
L7iEFoEH4vyCm4TtwPPLNkIQysST2l9wGYkAgtOIAASnEQEI1WbnHvbtzOGzCSIAocJsZ9/ebezYe9fyjr1zD/fu3caOvXvYNcIe
RABChTnCwQPP8gosLYLE+eEofzrwDC+NsAcRgFBxlhFBBucHEYAwEQwRQUbnB7kOIEwU29l3zx3sAN7gPNexiSzODxIBhIniCAcP
PM4rsOj8j2RwfhABCBPH9r5Xo2R8BiECECaI/iYQbOMj94yW9kwjAhAmhJ7zv/L04/zmwB945OmjZBWBCECYAPqd/+Dh5O3Dz2QW
gQhAqDhDnF+TUQSSBhUs0XPUlXGBQ08e5NkzKytzoPObjHlNoL5ScwWheI5w8Om3sY9nlnZ+UJGAPexjtLSoRADBaaQPIDiNCEBw
GhGA4DQiAMFpRACC04gABKcRAQhOIwIQnEYEIDiNCEBwGhGA4DQiAMFpRACC04gABKcRAQhOIwIQnEYEIDiNCEBwGhGA4DQiAMFp
RACC04gABKcRAQhOIwIQnEYEIDiNCEBwGhGA4DQiAMFpRACC04gABKcRAQhOIwIQnEYEIDiNCEBwGhGA4DSySJ7bxKnnquKlnq0x
KQJInyDrB8Ix4uQRJQ+9bf69TMzz6yevfWPb2vmvugDi1AN6B8DqgXAI7exdYMF4dOk/zmWjz28NWGM8avSEkJkqC8A8Ud1kW9cE
+iBYOxAOEaOO5xxwCZhNnueADv2RoEx8lH9OAeuBDcnzFBYrv6oKQDt/B5ind3JA1QJTyXOdyRdBDFxOnteRb2JCH9cFlNOfAV5P
ni+ijrOOBGWia/4p4FrgeuBNyd+sNoWqLIAO6oRcTB5XUD94HeqgbGDymkIXgeeSx4vACx4893w76AA0mi0fuBm4FdgF3AbcDmy2
aIMWwCzK+f8LHANOo0RRhSiga//1wFbgxuT9KXqVX83GjqooAB2iF1AOcwZ1ci6gHH0T6qBATh2jHDgE/Bb4edgOTg77UNgOIuD5
5AFAo9naDHwR+CTwIbL9Tt3GNyPAMeAwcBx1jOfpCWDYvrJGiOXK9YG1wEbgrcl7m4Drkvf071iVEUA3fS4D54ATwFHgLOoHX48S
SJ0cOkWW+Svwk7Ad/GLcAsJ2cA54EHiw0Wx9BrgPuCODTbpfpaPraZTz62NsCqAstAC2JK+30N9Es2Zf1QSg26jz9E7OUVSYPo1y
8vPJ8xRwDepA1ahWFLgE/Aj4TtgOurYKDdvBY8BjjWbrfuCbjN80MpuYl1A1/9nkMUc1BDCVbG+iv5NutX9SNQHo9qlZ+/8PeBXV
XvWTv61F9QOuRYlAd4attAszchj4etgOfpfXDsJ28ECj2ZoGHgLeN0YRZoZNJxpUssFjji5dAN/Hi3wfogjwwY/wI4jU5ljo70Y+
+j/wffwoIooS565RS7a0XR16Nf+qFYAZmi/QH5qPJq99lEDWoWq/zajO8BTVaAodAj4dtoOX8t5R2A6eajRbLeBx4MMjfDVObUfm
w4+JDs0EpV4hvrXZiqKUXVxttxWqMhYonZ47i6r9jwGvASdRAnjdeP9Y8v45+rMXZaXwngc+VoTza8J2cALYB/y5qH2uNqokgA4q
1Xke5ejH6Tn/G8n755Ptk8nfjiefvZB813obcYW8jKr5h2Z48iJsB5eAu4C/ZyimKn2nQeRqWxUEYKY9Z1EOfgLl4CeS1xdRbf/L
KGc/Y3zmJCpiXErKKDoKXAa+EbaDFwvcZx9JJLgPFQ0zEfnlu0SRNpT/a69Oe55COfZrqNr9PHCFmAVi5pf9XPFR4KdhO3iiwP0N
JGwHTwE/yFxQVHYCqFgbyhbAsJy0WbPPAvN4dKnRRWUF0pHiePJ6Nvl7UZfz/wXetwvYz4oI28EDwLPZSinbJaBIG8r8tWbH9zLK
2XWtbrbt54jpEhHTIfa8RcEM6iucS8oq6nL+w2H7j/MF7GcUHiKL+MfNb9qkQBvKFsCgtKfpzCq7UyMKZ4I4nAni2PP1hTIzW6T7
C6fJ6YrhAP4ZtoOHcyx/LJKLZX8Z9/uO+X9pAkinPXVm5xjKkfXoxHmgG04HRo0WxcQDhaPTokV1iJ/MqVwbjGrb4jGKKtACStmQ
a1O2rJ+rO75m2lM3fU6RNGU8jwX8/lo8nA5iYiLivivGZtNJD5zLc2jvPPBoDuXa4meMmRGSCJA/5nifWfpTmrr2nwXm45iov/ZX
hDNBjHdV5zmdOtUd4jyiwN/CdvBvy2VaIxlAN1O2HZNAGQJYLu15AbjiQRd/Ccf1ib3BUWRQWtR2nfKc5fLyYBJsLJ2iBbBc2vMN
kvZ7HKXb/v2E00HsrSyS6NGNNqNAZWt/g8KGZEwyRQpg0Hgfc0hDL4MT0w1nhju/5lA7UMnRwZmkU8k+LmO/Q3zYUjl5cqhsAyaB
IkeDptOeg3L4l4hZoDZCk6VGROQtQGxmk65DTZzZghoyPYX6rbbmDLxsoYy8eQEl+grkdapLUQcn3fE1B7T1pz09f8mmTxr12Xi5
q8m206KvWigjV5LplZfLtqPqFBUBhqU9dVPlPPoKbhSN7qA+EV06eFd1rM0oYE6cyRoFqjDxZiVUeZRnJSgiAujaf45eZ1XX0Isp
Sy+poVfS9k8TTi+mRfVUynSH2PY4oe0Zv587tzRbddTEIWEJ8hbAisf7xDGdJGyPRd0n9ry+KGPupz/KZE+Lvivj93MnVrdUkQiw
DEUIYFj7/ARm+zzO5pQz00Ece8sOrzCjQJb9vTOLrQVxc9kGTAJF3oVMpz2PoUTQdzeycZo+acLpwOxrDMo06bSonjMw7j53ZbW1
AHaXbcAkkGcnWNf+aWfsG++jBjlbvFIbEeHToV90g9Ki+qar4zQTbrNjbK5Mgo2lk1cE0M4/bPKKkfa0U/trkrKGdYhtpUXf22i2
KtvEaDRbNyACWBF5CcAc76M7pLop0j9OZ6nxPmNS94nwBo430h3vrNMn68Bn7VibC19ARbqRqeBw6FzJY1fp2l/XwHq8/uJ4Hxg8
2jMrM9NB7Ht9E+1NG2ylRe9sNFtVvR7wqRE/v9gMrOBw6Im7K4RZ+6fH+5jTHHOp/Q0jzLRoukOs06JZRovuBL5qx1p7NJqtz6Pu
Lj0WEgGyMezubuk5uwt4fpxH7a8Jp4PYi4nA01Fg2OC7LFFgf6PZ2mjJ5MwkEekrmQpxTAE292SO9xk02vMM5kwtf4whDyMS+cQQ
m6NF01FAd4jHjQI7gAfsWGuF7wIfyFZEBdpABdpgWwDa2dJ3bNBpzytJ0yeXtn+acDqIiRanT15KbNCifI3e9MksTaEvNZqtz1ky
eWwazdYngK9lLqgCN8Yq0gZbexqUetQT1c3RnnPUlp7oYpvU9Ml0s0x3iLOkRdcA3280W1nu2Z+JRrO1C/ghakWVTPgVuDFWkTbY
EoB5BXb4Xdu8uJtcrS2WqB57XjxsnJCNtOiNwKONZusmOwavnCTn/2tUp3xcyl4TbClytc3GleB07a/H4Ogrvr3hB7EXNz7Y8ujU
gQ71OnQ6iRn1jnK/ep36iFZ1Osl/qlhVXLJJR5Udd70Yr29YhhbBVtQV4g1kW2xjN/D7RrN1d9gOMt6dbWU0mq3dKOe/pYj9rUZs
CEBnfnS68QzKuU7Tq1nVzCSPGhE1fLXgY2dxvlKnN3ep24k746yp4uMReeDHEPWWlMTv9BZYVf9rW88mNp5CrUC4BdWEMEUwKruB
JxrN1rfCdvDLMb6/YhrN1p2opZN2jPhVL7Xtm4/Iw2/c3oqhvAUyIg+fuN+uAXZbIasA9IAy3fmdpXcbc51dqaEmo9SIVxDOMv20
ZYvXqw/6iW2mvXoC/TqyTZ+8ETiQ9AnuD9vBhTHKGEqj+dG1EH8P+DLjj/c311uuo0S/FpgiBn0vJvWf9vRI/+s9j4NRxmIpUaS2
dIM8XlwiSdtVJ6cFUGxGgAV6S9rEqM6hvhyf1/15RkWfeL3+bJ1e6naO/hXTs7AG2A98vNFsPQz82MZaYY1maz/E+4F3ZyzKo38R
6o30FqSr2iJ5G+ktkK0rJmvYiADms4+q7TcBb0m2y1y4YhD65K+jd4Cn6E8I2LJ1B6qZcm+j2XoC+FXYDl4YpYCkY303apnU91iw
Sdf8uhLYSv9SpFVcJnUr/aN4reVJvUazleXHDMr+mMOdq7LwchofVUuvR4ngBpRg34xyAj1/2PY4lA7wD9RNq15C3V3iP8ARVOR5
O2qyzU7gJtSIzvejnMEG6TWC9Qqck7BQ9juAbahh7esZfyh7H1kjgG5SmDWqj1JuHvfjsYVHbz7AOpS9m8nP8TV11EytModSa/Fv
QHX+QYnevKt22edLnx8dpa5H2boBZbu1CGCjD6AFcA299Xs301vasuyDOQjdwdXOsBZlv25nlr3aZF6Yv1lfNJtCTRjS6/CWXftr
tF/pfsoGejW/tfNjIwJAT636Ob20ZZVEMCwNmFumoWKYtatOCGykV1lV5VzpSkpHav0YN0U9EBsRQDuRfk4fxKoc0DRpIaQfq5X0
+VpDbyCjpuxzZh5/01a9XSkBwGCjyj6IK2U1O/swTKHXqP658lLP1shzUryLjjVp5OZYk0IFxr4KQnmIAASnEQEITiMCEJxGBCA4
jQhAcBoRgOA0IgDBaUQAgtOIAASnEQEITiMCEJxGBCA4jQhAcBoRgOA0IgDBaUQAgtOIAASnEQEITiMCEJxGBCA4jQhAcBoRgOA0
IgDBaUQAgtOIAASnEQEITiMCEJxGBCA4jQhAcBoRgOA0IgDBaUQAgtOIAASnEQEITiMCEJxGBCA4jQhAcBoRgOA0IgDBaUQAgtOI
AASnEQEITiMCEJxGBCA4jQhAcBoRgOA0IgDBaUQAgtOIAASnEQEITiMCEJxGBCA4jQhAcBoRgOA0IgDBaUQAgtOIAASn8QAazVZc
tiGCUDRhO/AkAghO4+kNiQKCS4TtwANDACAiENxAOz+kBAAiAmF1Yzo/DBCARoQgrCbSjq/5PyXFSFQv5ANnAAAAAElFTkSuQmCC
)"

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +AlwaysOnTop
Gui, 1: Show, NA

pBitmap:=Gdip_BitmapFromBase64(Base64ImageData)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)

WinGetPos, X, Y, Width, Height, ahk_id %MyGui%
xB := (Width - 100) / 2, yB := Height - 45
xE := Width - 24
CustomColor = 211B1B
Gui, 2:+LastFound -Caption +HwndMyGui_ +AlwaysOnTop
Gui, 2:Font, s13 Bold
Gui, 2:Add, Text, x%xE% y6 cWhite gX, X
Gui, 2:Font, s12 Bold, Calibri
Gui, 2:Color, %CustomColor%
Gui, 2:Add, Button, x%xB% y%yB% w100 h30, Click Me
Gui, 2:Add, Text, x0 ym+20 w%Width% +Center cYellow vMP +BackgroundTrans
WinSet, TransColor, %CustomColor% 255
Gui, 2: Show, x%X% y%Y% w%Width% h%Height% NoActivate
exDock := new Dock(MyGui, MyGui_)
exDock.Position("Custom")
exDock.CloseCallback := Func("CloseCallback")
OnMessage(0x201, "WM_LBUTTONDOWN")
SetTimer, MousePosition, 200
Return

X:
1GuiClose:
2GuiClose:
ExitApp

2ButtonClickMe:
   Msgbox, Awesome!, you clicked me.
Return

MousePosition:
   MouseGetPos, X, Y
   GuiControl, 2:, MP, X=%X%, Y=%Y%
Return

WM_LBUTTONDOWN()
{
   PostMessage, 0xA1, 2
}

Gdip_BitmapFromBase64(ByRef Base64) {
   pBitmap := 0
   DecLen := 0
   ; calculate the length of the buffer needed
   If !DllCall("crypt32\CryptStringToBinary"
      , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
Return -1
VarSetCapacity(Dec, DecLen, 0)
; decode the Base64 encoded string
If !DllCall("crypt32\CryptStringToBinary"
   , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
Return -2
; create a memory stream
If !(pStream := DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"))
Return -3
DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", pStream, "PtrP", pBitmap)
ObjRelease(pStream)
Return pBitmap
}
Class_Dock
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

20 Apr 2021, 15:32

Smile_ wrote:
20 Apr 2021, 13:59
Here is an approach:

Code: Select all

#Include, Class_Dock.ahk
#Include Gdip_All.ahk
If !pToken := Gdip_Startup()
{
   MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
   ExitApp
}
Base64ImageData := "
( LTrim Join
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
)"

Gui, 1: -Caption +E0x80000 +HwndMyGui +OwnDialogs +AlwaysOnTop
Gui, 1: Show, NA

pBitmap:=Gdip_BitmapFromBase64(Base64ImageData)
Gdip_GetDimensions(pBitmap, w, h)

hbm := CreateDIBSection(w,h)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)

Gdip_DrawImage(pGraphics, pBitmap,0,0,w,h)
UpdateLayeredWindow(MyGui, hdc, (A_ScreenWidth-w)//2, (A_ScreenHeight-h)//2, w,h)

WinGetPos, X, Y, Width, Height, ahk_id %MyGui%
xB := (Width - 100) / 2, yB := Height - 45
xE := Width - 24
CustomColor = 211B1B
Gui, 2:+LastFound -Caption +HwndMyGui_ +AlwaysOnTop
Gui, 2:Font, s13 Bold
Gui, 2:Add, Text, x%xE% y6 cWhite gX, X
Gui, 2:Font, s12 Bold, Calibri
Gui, 2:Color, %CustomColor%
Gui, 2:Add, Button, x%xB% y%yB% w100 h30, Click Me
Gui, 2:Add, Text, x0 ym+20 w%Width% +Center cYellow vMP +BackgroundTrans
WinSet, TransColor, %CustomColor% 255
Gui, 2: Show, x%X% y%Y% w%Width% h%Height% NoActivate
exDock := new Dock(MyGui, MyGui_)
exDock.Position("Custom")
exDock.CloseCallback := Func("CloseCallback")
OnMessage(0x201, "WM_LBUTTONDOWN")
SetTimer, MousePosition, 200
Return

X:
1GuiClose:
2GuiClose:
ExitApp

2ButtonClickMe:
   Msgbox, Awesome!, you clicked me.
Return

MousePosition:
   MouseGetPos, X, Y
   GuiControl, 2:, MP, X=%X%, Y=%Y%
Return

WM_LBUTTONDOWN()
{
   PostMessage, 0xA1, 2
}

Gdip_BitmapFromBase64(ByRef Base64) {
   pBitmap := 0
   DecLen := 0
   ; calculate the length of the buffer needed
   If !DllCall("crypt32\CryptStringToBinary"
      , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
Return -1
VarSetCapacity(Dec, DecLen, 0)
; decode the Base64 encoded string
If !DllCall("crypt32\CryptStringToBinary"
   , "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
Return -2
; create a memory stream
If !(pStream := DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"))
Return -3
DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", pStream, "PtrP", pBitmap)
ObjRelease(pStream)
Return pBitmap
}
Class_Dock
My interface is not one whole.

When dragging the interface, the following happens:
Image
[Mod edit: Image fixed.]

Forgive me for having so many problems xd
User avatar
Smile_
Posts: 857
Joined: 03 May 2020, 00:51

Re: Gdip Convert Base64 to PNG

20 Apr 2021, 23:02

Ah forgive me, my bad, please try with this Class_Dock.ahk instead.

Code: Select all

/*
	Class Dock
		Attach a window to another
	Author
		Soft (visionary1 예지력)
	version
		0.1 (2017.04.20)
		0.2 (2017.05.06)
		0.2.1 (2017.05.07)
		0.2.1.1 bug fixed (2017.05.09)
		0.2.2 testing multiple docks... (2017.05.09)
	License
		WTFPL (http://wtfpl.net/)
	Dev env
		Windows 10 pro x64
		AutoHotKey H v1.1.25.01 32bit
	To Do...
		Multiple Dock, group windows...
	thanks to
		Helgef for overall coding advices
*/
class Dock
{
    static EVENT_OBJECT_LOCATIONCHANGE := 0x800B
    , EVENT_OBJECT_FOCUS := 0x8005, EVENT_OBJECT_DESTROY := 0x8001
    , EVENT_MIN := 0x00000001, EVENT_MAX := 0x7FFFFFFF ;for debug
    , EVENT_SYSTEM_FOREGROUND := 0x0003

	/*
		Instance := new Dock(Host hwnd, Client hwnd, [Callback], [CloseCallback])
			Host hwnd
				hwnd of a Host window
			Client hwnd
				hwnd of a window that follows Host window (window that'll be attached to a Host window)
			[Callback]
				a func object, or a bound func object
				if omitted, default EventsHandler will be used, which is hard-coded in 'Dock.EventsHandler'
				To construct your own events handler, I advise you to see Dock.EventsHandler first
			[CloseCallback]
				a func object, or a bound func object
				called when Host window is destroyed, see 'Dock Example.ahk' for practical usuage
    */
    __New(Host, Client, Callback := "", CloseCallback := "")
    {
        this.hwnd := []
        this.hwnd.Host := Host
        this.hwnd.Client := Client
        WinSet, ExStyle, +0x80, % "ahk_id " this.hwnd.Client

        this.Bound := []

        this.Callback := IsObject(Callback) ? Callback : ObjBindMethod(Dock.EventsHandler, "Calls")
        this.CloseCallback := IsFunc(CloseCallback) || IsObject(CloseCallback) ? CloseCallback

		/*
			lpfnWinEventProc
        */
        this.hookProcAdr := RegisterCallback("_DockHookProcAdr",,, &this)

		/*
			idProcess
        */
        ;WinGet, idProcess, PID, % "ahk_id " . this.hwnd.Host
        idProcess := 0

		/*
			idThread
        */
        ;idThread := DllCall("GetWindowThreadProcessId", "Ptr", this.hwnd.Host, "Int", 0)
        idThread := 0

        DllCall("CoInitialize", "Int", 0)

        this.Hook := DllCall("SetWinEventHook"
        , "UInt", Dock.EVENT_SYSTEM_FOREGROUND 		;eventMin
        , "UInt", Dock.EVENT_OBJECT_LOCATIONCHANGE 	;eventMax
        , "Ptr", 0				 	;hmodWinEventProc
        , "Ptr", this.hookProcAdr 			;lpfnWinEventProc
        , "UInt", idProcess			 	;idProcess
        , "UInt", idThread			 	;idThread
        , "UInt", 0)					;dwFlags
    }

	/*
		Instance.Unhook()
			unhooks Dock and frees memory
    */
    Unhook()
    {
        DllCall("UnhookWinEvent", "Ptr", this.Hook)
        DllCall("CoUninitialize")
        DllCall("GlobalFree", "Ptr", this.hookProcAdr)
        this.Hook := ""
        this.hookProcAdr := ""
        this.Callback := ""
        WinSet, ExStyle, -0x80, % "ahk_id " this.hwnd.Client
    }

    __Delete()
    {
        this.Delete("Bound")

        If (this.Hook)
            this.Unhook()

        this.CloseCallback := ""
    }

	/*
		provisional
    */
    Add(hwnd, pos := "")
    {
        static last_hwnd := 0

        this.Bound.Push( new this( !NumGet(&this.Bound, 4*A_PtrSize) ? this.hwnd.Client : last_hwnd, hwnd ) )

        If pos Contains Top,Bottom,R,Right,L,Left,Custom
            this.Bound[NumGet(&this.Bound, 4*A_PtrSize)].Position(pos)

        last_hwnd := hwnd
    }

	/*
		Instance.Position(pos)
			pos - sets position to dock client window
				Top - sets to Top side of the host window
				Bottom - sets to bottom side of the host window
				R or Right - right side
				L or Left -  left side
    */
    Position(pos)
    {
        this.pos := pos
        Return this.EventsHandler.EVENT_OBJECT_LOCATIONCHANGE(this, "host")
    }

	/*
		Default EventsHandler
    */
    class EventsHandler extends Dock.HelperFunc
    {
        Calls(self, hWinEventHook, event, hwnd)
        {
            Critical

            If (hwnd = self.hwnd.Host)
            {
                Return this.Host(self, event)
            }

            If (hwnd = self.hwnd.Client)
            {
                Return this.Client(self, event)
            }
        }

        Host(self, event)
        {
            If (event = Dock.EVENT_SYSTEM_FOREGROUND)
            {
                Return this.EVENT_SYSTEM_FOREGROUND(self.hwnd.Client)
            }

            If (event = Dock.EVENT_OBJECT_LOCATIONCHANGE)
            {
                Return this.EVENT_OBJECT_LOCATIONCHANGE(self, "host")
            }

            If (event = Dock.EVENT_OBJECT_DESTROY)
            {
                self.Unhook()

                If (IsFunc(self.CloseCallback) || IsObject(self.CloseCallback))
                    Return self.CloseCallback()
            }
        }

        Client(self, event)
        {
            If (event = Dock.EVENT_SYSTEM_FOREGROUND)
            {
                Return this.EVENT_SYSTEM_FOREGROUND(self.hwnd.Host)
            }

            If (event = Dock.EVENT_OBJECT_LOCATIONCHANGE)
            {
                Return this.EVENT_OBJECT_LOCATIONCHANGE(self, "client")
            }
        }

		/*
			Called when host window got focus
			without this, client window can't be showed (can't set to top)
        */
        EVENT_SYSTEM_FOREGROUND(hwnd)
        {
            Return this.WinSetTop(hwnd)
        }

		/*
			Called when host window is moved
        */
        EVENT_OBJECT_LOCATIONCHANGE(self, via)
        {
            Host := this.WinGetPos(self.hwnd.Host)
            Client := this.WinGetPos(self.hwnd.Client)
            ;If (Host.x = "") || (Client.x = "")
            ;    Return
            If InStr(self.pos, "Top")
            {
                If (via = "host")
                {
                    Return this.MoveWindow(self.hwnd.Client 	;hwnd
                    , Host.x		;x
                    , Host.y - Client.h 	;y
                    , Client.w	 	;width
                    , Client.h) 		;height
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y + Client.h ;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "Bottom")
            {
                If (via = "host")
                {		 
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x		;x
                    , Host.y + Host.h 	;y
                    , Client.w	 	;width
                    , Client.h)	 	;height
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y - Host.h 	;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "R")
            {
                If (via = "host")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x + Host.w 	;x
                    , Host.y		;y
                    , Client.w	 	;width
                    , Client.h)	 	;height	
                }

                If (via = "client")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x - Host.w 	;x
                    , Client.y	 	;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "L")
            {
                If (via = "host")
                {
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x - Client.w 	;x
                    , Host.y		;y
                    , Client.w	 	;width
                    , Client.h)	 	;height	
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x + Client.w ;x
                    , Client.y	 	;y
                    , Host.w		;width
                    , Host.h)	 	;height	
                }
            }

            If InStr(self.pos, "Custom")
            {
                If (via = "host")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Client 	;hwnd
                    , Host.x		;x
                    , Host.y 	;y
                    , Client.w	 	;width
                    , Client.h) 		;height
                }

                If (via = "client")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y ;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }
        }
    }

    class HelperFunc
    {
        WinGetPos(hwnd)
        {
            WinGetPos, hX, hY, hW, hH, % "ahk_id " . hwnd
            Return {x: hX, y: hY, w: hW, h: hH}
        }

        ;WinSetTop(hwnd)
        ;{
        ;    WinSet, AlwaysOnTop, On, % "ahk_id " . hwnd
        ;    WinSet, AlwaysOnTop, Off, % "ahk_id " . hwnd
        ;}

        MoveWindow(hwnd, x, y, w, h)
        {
            Return DllCall("MoveWindow", "Ptr", hwnd, "Int", x, "Int", y, "Int", w, "Int", h, "Int", 1)
        }

        Run(Target)
        {
            Try Run, % Target,,, OutputVarPID
            Catch, 
                Throw, "Couldn't run " Target

            WinWait, % "ahk_pid " OutputVarPID

            Return WinExist("ahk_pid " OutputVarPID)
        }
    }
}

_DockHookProcAdr(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{
    this := Object(A_EventInfo)
    this.Callback.Call(this, hWinEventHook, event, hwnd)
}
bapl
Posts: 119
Joined: 17 Apr 2021, 00:24

Re: Gdip Convert Base64 to PNG

21 Apr 2021, 01:59

Smile_ wrote:
20 Apr 2021, 23:02
Ah forgive me, my bad, please try with this Class_Dock.ahk instead.

Code: Select all

/*
	Class Dock
		Attach a window to another
	Author
		Soft (visionary1 예지력)
	version
		0.1 (2017.04.20)
		0.2 (2017.05.06)
		0.2.1 (2017.05.07)
		0.2.1.1 bug fixed (2017.05.09)
		0.2.2 testing multiple docks... (2017.05.09)
	License
		WTFPL (http wtfpl.net /)  Broken Link for safety
	Dev env
		Windows 10 pro x64
		AutoHotKey H v1.1.25.01 32bit
	To Do...
		Multiple Dock, group windows...
	thanks to
		Helgef for overall coding advices
*/
class Dock
{
    static EVENT_OBJECT_LOCATIONCHANGE := 0x800B
    , EVENT_OBJECT_FOCUS := 0x8005, EVENT_OBJECT_DESTROY := 0x8001
    , EVENT_MIN := 0x00000001, EVENT_MAX := 0x7FFFFFFF ;for debug
    , EVENT_SYSTEM_FOREGROUND := 0x0003

	/*
		Instance := new Dock(Host hwnd, Client hwnd, [Callback], [CloseCallback])
			Host hwnd
				hwnd of a Host window
			Client hwnd
				hwnd of a window that follows Host window (window that'll be attached to a Host window)
			[Callback]
				a func object, or a bound func object
				if omitted, default EventsHandler will be used, which is hard-coded in 'Dock.EventsHandler'
				To construct your own events handler, I advise you to see Dock.EventsHandler first
			[CloseCallback]
				a func object, or a bound func object
				called when Host window is destroyed, see 'Dock Example.ahk' for practical usuage
    */
    __New(Host, Client, Callback := "", CloseCallback := "")
    {
        this.hwnd := []
        this.hwnd.Host := Host
        this.hwnd.Client := Client
        WinSet, ExStyle, +0x80, % "ahk_id " this.hwnd.Client

        this.Bound := []

        this.Callback := IsObject(Callback) ? Callback : ObjBindMethod(Dock.EventsHandler, "Calls")
        this.CloseCallback := IsFunc(CloseCallback) || IsObject(CloseCallback) ? CloseCallback

		/*
			lpfnWinEventProc
        */
        this.hookProcAdr := RegisterCallback("_DockHookProcAdr",,, &this)

		/*
			idProcess
        */
        ;WinGet, idProcess, PID, % "ahk_id " . this.hwnd.Host
        idProcess := 0

		/*
			idThread
        */
        ;idThread := DllCall("GetWindowThreadProcessId", "Ptr", this.hwnd.Host, "Int", 0)
        idThread := 0

        DllCall("CoInitialize", "Int", 0)

        this.Hook := DllCall("SetWinEventHook"
        , "UInt", Dock.EVENT_SYSTEM_FOREGROUND 		;eventMin
        , "UInt", Dock.EVENT_OBJECT_LOCATIONCHANGE 	;eventMax
        , "Ptr", 0				 	;hmodWinEventProc
        , "Ptr", this.hookProcAdr 			;lpfnWinEventProc
        , "UInt", idProcess			 	;idProcess
        , "UInt", idThread			 	;idThread
        , "UInt", 0)					;dwFlags
    }

	/*
		Instance.Unhook()
			unhooks Dock and frees memory
    */
    Unhook()
    {
        DllCall("UnhookWinEvent", "Ptr", this.Hook)
        DllCall("CoUninitialize")
        DllCall("GlobalFree", "Ptr", this.hookProcAdr)
        this.Hook := ""
        this.hookProcAdr := ""
        this.Callback := ""
        WinSet, ExStyle, -0x80, % "ahk_id " this.hwnd.Client
    }

    __Delete()
    {
        this.Delete("Bound")

        If (this.Hook)
            this.Unhook()

        this.CloseCallback := ""
    }

	/*
		provisional
    */
    Add(hwnd, pos := "")
    {
        static last_hwnd := 0

        this.Bound.Push( new this( !NumGet(&this.Bound, 4*A_PtrSize) ? this.hwnd.Client : last_hwnd, hwnd ) )

        If pos Contains Top,Bottom,R,Right,L,Left,Custom
            this.Bound[NumGet(&this.Bound, 4*A_PtrSize)].Position(pos)

        last_hwnd := hwnd
    }

	/*
		Instance.Position(pos)
			pos - sets position to dock client window
				Top - sets to Top side of the host window
				Bottom - sets to bottom side of the host window
				R or Right - right side
				L or Left -  left side
    */
    Position(pos)
    {
        this.pos := pos
        Return this.EventsHandler.EVENT_OBJECT_LOCATIONCHANGE(this, "host")
    }

	/*
		Default EventsHandler
    */
    class EventsHandler extends Dock.HelperFunc
    {
        Calls(self, hWinEventHook, event, hwnd)
        {
            Critical

            If (hwnd = self.hwnd.Host)
            {
                Return this.Host(self, event)
            }

            If (hwnd = self.hwnd.Client)
            {
                Return this.Client(self, event)
            }
        }

        Host(self, event)
        {
            If (event = Dock.EVENT_SYSTEM_FOREGROUND)
            {
                Return this.EVENT_SYSTEM_FOREGROUND(self.hwnd.Client)
            }

            If (event = Dock.EVENT_OBJECT_LOCATIONCHANGE)
            {
                Return this.EVENT_OBJECT_LOCATIONCHANGE(self, "host")
            }

            If (event = Dock.EVENT_OBJECT_DESTROY)
            {
                self.Unhook()

                If (IsFunc(self.CloseCallback) || IsObject(self.CloseCallback))
                    Return self.CloseCallback()
            }
        }

        Client(self, event)
        {
            If (event = Dock.EVENT_SYSTEM_FOREGROUND)
            {
                Return this.EVENT_SYSTEM_FOREGROUND(self.hwnd.Host)
            }

            If (event = Dock.EVENT_OBJECT_LOCATIONCHANGE)
            {
                Return this.EVENT_OBJECT_LOCATIONCHANGE(self, "client")
            }
        }

		/*
			Called when host window got focus
			without this, client window can't be showed (can't set to top)
        */
        EVENT_SYSTEM_FOREGROUND(hwnd)
        {
            Return this.WinSetTop(hwnd)
        }

		/*
			Called when host window is moved
        */
        EVENT_OBJECT_LOCATIONCHANGE(self, via)
        {
            Host := this.WinGetPos(self.hwnd.Host)
            Client := this.WinGetPos(self.hwnd.Client)
            ;If (Host.x = "") || (Client.x = "")
            ;    Return
            If InStr(self.pos, "Top")
            {
                If (via = "host")
                {
                    Return this.MoveWindow(self.hwnd.Client 	;hwnd
                    , Host.x		;x
                    , Host.y - Client.h 	;y
                    , Client.w	 	;width
                    , Client.h) 		;height
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y + Client.h ;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "Bottom")
            {
                If (via = "host")
                {		 
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x		;x
                    , Host.y + Host.h 	;y
                    , Client.w	 	;width
                    , Client.h)	 	;height
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y - Host.h 	;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "R")
            {
                If (via = "host")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x + Host.w 	;x
                    , Host.y		;y
                    , Client.w	 	;width
                    , Client.h)	 	;height	
                }

                If (via = "client")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x - Host.w 	;x
                    , Client.y	 	;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }

            If InStr(self.pos, "L")
            {
                If (via = "host")
                {
                    Return this.MoveWindow(self.hwnd.Client	 	;hwnd
                    , Host.x - Client.w 	;x
                    , Host.y		;y
                    , Client.w	 	;width
                    , Client.h)	 	;height	
                }

                If (via = "client")
                {
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x + Client.w ;x
                    , Client.y	 	;y
                    , Host.w		;width
                    , Host.h)	 	;height	
                }
            }

            If InStr(self.pos, "Custom")
            {
                If (via = "host")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Client 	;hwnd
                    , Host.x		;x
                    , Host.y 	;y
                    , Client.w	 	;width
                    , Client.h) 		;height
                }

                If (via = "client")
                {
                    If (Host.x = "") || (Client.x = "")
                        Return
                    Return this.MoveWindow(self.hwnd.Host	 	;hwnd
                    , Client.x	 	;x
                    , Client.y ;y
                    , Host.w		;width
                    , Host.h)	 	;height
                }
            }
        }
    }

    class HelperFunc
    {
        WinGetPos(hwnd)
        {
            WinGetPos, hX, hY, hW, hH, % "ahk_id " . hwnd
            Return {x: hX, y: hY, w: hW, h: hH}
        }

        ;WinSetTop(hwnd)
        ;{
        ;    WinSet, AlwaysOnTop, On, % "ahk_id " . hwnd
        ;    WinSet, AlwaysOnTop, Off, % "ahk_id " . hwnd
        ;}

        MoveWindow(hwnd, x, y, w, h)
        {
            Return DllCall("MoveWindow", "Ptr", hwnd, "Int", x, "Int", y, "Int", w, "Int", h, "Int", 1)
        }

        Run(Target)
        {
            Try Run, % Target,,, OutputVarPID
            Catch, 
                Throw, "Couldn't run " Target

            WinWait, % "ahk_pid " OutputVarPID

            Return WinExist("ahk_pid " OutputVarPID)
        }
    }
}

_DockHookProcAdr(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{
    this := Object(A_EventInfo)
    this.Callback.Call(this, hWinEventHook, event, hwnd)
}
Oh, you are a wizard!
I am very grateful for such help!

Спасибо вам!(Thank you!) :3

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: iamMG and 117 guests