创建一个仿Windows 10样式的通知弹窗,适用于Windows 7或者系统托盘图标被隐藏时的通知显示。
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
OnExit, Exit
CustomTrayTip("消息通知:","仿win10 TrayTip通知样式,可用在win7或托盘图标隐藏的脚本上!",1,True)
Sleep,4000
ExitApp
Return
;;;================================================================================================
/* ; By 蜜獾哥
仿win10 TrayTip通知,可用在win7或托盘图标隐藏的脚本上!
title:标题
text:内容
Mode:1消息,2警告,3错误
Dark:true深色模式,False浅色模式
Transparent:透明度[0-255],0透明,255不透明
Timeout:显示时长
*/
CustomTrayTip(title,text:="",Mode=1,Dark:=True,Transparent:=225,Timeout:=3500){
;;Critical
Global CTToken,hCTT,CTTimer
Static Index
if (title=""&&text=""){
Return
}
Gosub FormatString
TitleFntSize:=22,TextFntSize:=20,Transparent:=Transparent>255?255:Transparent<0?0:Transparent
NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
SystemFontName:=StrGet(&info + 52)?StrGet(&info + 52):"宋体"
if !DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UPtr*", CTToken, "UPtr", &si, "UPtr", 0)
If !CTToken
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
Gui, TT: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs +HWNDhCTT -DPIScale
Gui, TT: Show, NA
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(1, bi, 4, "uint")
NumPut(1, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm), DllCall("gdiplus\GdipCreateFromHDC", "UPtr", hdc, "UPtr*", G)
DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", SystemFontName, "uint", 0, "UPtr*", hFamily)
If !hFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TitleFntSize, "int", text=""&&title<>""?0:1, "int", 0, "UPtr*", tFont)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TextFntSize, "int", 0, "int", 0, "UPtr*", hFont)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", tFormat)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", hFormat)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", title, "int", -1, "UPtr"
, tFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TitleRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", Text, "int", -1, "UPtr"
, hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TextRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
base64_1=
(join`r`n LTrim
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABMVJREFUeF7tm02IHEUUx/+vdyN+BrZHo
h4Mxp3uJQGPJnrQQ7KKB00O4kEURPBjtyYnAyqKHhTFCHrK1q4fIIKoJyGJAdHVgx408ZiD7PRsIuZgEu1e8DPETT/puGN2Z7qnq7urqxtmF/qy86rqvd+8e
l0f/yEM+R8NefxYB7CeAQYIjMmFOwDrHgI2RQ8zXwdg08oTeXA2eojoDANnowcIP1sSE9+U7V5pU6Axt7gLzHcz84MAbswZyCki+ghEn/tT41/m7GNgM60Ar
jnwQ2MDjQiQ9TDArl6HqQ0OP/iHL8jf9271dfWtBcBN7528/Le/lwURBDPGdTkX1w8RFpkhN14xKn98dMu5omMVBjAm21PEJEC4pagzmdozjjOxXBLuXKZ2P
caFANiy/RZATxRxoHhbfjsQ7pN5+8kNwJadLwCezDuw3nY0H4jmXXn6zAXAlt4igJvzDFhimxOBcDLXn8wAbOlxiUEU7joQTqaYMhnbsnMM4FsLe1lqB/R9I
JrbVYdQBtCY9WaYIVQ7rtKOCNKfdloqPigBaMj2awx6RqXDutgQeL8v3GfT/EkFcPE9D5pN6yjr571ztYzawuDptHXCQAAXV3h/LR8rY5FjAgAYxzdeObp90
IpxIABbek8BeCPrt6tibwTAf47sC4TzZpJPiQCijc1lI6NHy1rbmwIQ7R3OX1jekbSBSgRgz7RfANFLKt9m7W2YXwxa7stxfiYCaEivwyh3Z2cKHAGLvnCay
gCuld7uEDhoykET41jAnl+Fc6h3rNgMsKX3DoDHTDhmcIx3A+E8rgrgZwDXl+cczQN0ZMTCkV+mxr1onDLWAT3+nw6Ec0MqgMaBhV1sWfNagyc6A+bDFIYf+
3snYs/2DAAAheFk7/h9U2BMeq8Q8JwuAKq7MxMAGHh1STjPr46tD4Du+U9s3e+3xj9JA2oCAIC+OtAHoCG9gwzsTnNY9XMCf+gL96HV9vacd3sw5Xy75n8Gz
hkIOOQLZ8/gDJhpfweiHaoBKtidO7+MzRtG8AAR7wTRVjC2mVoJrvGP+WjQcm9LA3ACRFsUAitkUhGAk0HLXXOU118DZtp/gOiqQtEpNK4IwJ9By706LQOGH
sDQTwHdRTB2QlQ0BdKLoO7XYFI5qAKA2mvQ0EaoCgBKCyHdS+E6ZYDSUjhScxCsrxXeZIVMqsgARnhnr+ok6TzgpwKqDiUwFQA4FQhnc+p2ODJozHb2M/PTS
pHkNDINgIhe96ebfZc7sRkQ6Xs4DPWeCfSAMg7AsibjdEbJp8Kys6Bf53OJglkA1A5EcyIuWSs7FjcKIM+xuK6LEdUToaRSUvSgJPfFSOSQjquxqgHkvhqLA
Oi4HK0UQNHL0QhC0evxKgEUvh7vzst6yOGyLjjU5HOpAolLEOoki0uDoS6bUwawUhTrKI/rpZFJLpcJwAqE4ZXJrZoONZTLZZPHdWPJnAHdhnWSzWWRxSntB
tNKzP8QaiCfU5XDJcWUOwO6HQ61XL4LYah/MLE6tbo/mSGiR3TriyKdDzO/X8ufzMTNrxWd0X0A7i2gNjkN4FMLOByn71GtVYPsCtcAFSci1UloWTuz/GzOC
sOvktQkKmOq2hgBoOpMFXbrAKqgXqcxhz4D/gVkGDdfoNgmzwAAAABJRU5ErkJggg==
)
base64_2=
(join`r`n LTrim
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
)
base64_3=
(join`r`n LTrim
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
)
Base64:=Mode=3?base64_3:Mode=2?base64_2:base64_1
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
VarSetCapacity(Dec, DecLen, 0)
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"), "PtrP", pBitmap)
;;78感叹号,155问号,110
;;pBitmap := Gdip_CreateBitmapFromFile("shell32.dll" ,Mode=3?110:Mode=2?78:278,40)
DllCall("gdiplus\GdipGetImageWidth", "UPtr", pBitmap, "uint*", ImageWidth)
DllCall("gdiplus\GdipGetImageHeight", "UPtr", pBitmap, "uint*", ImageHeight)
Width := Max(Width:=320,ImageWidth+Max(TitleRC[3]+15,TextRC[3]+15)+40), Height := Max(Height:=120,Max(ImageHeight+50,TitleRC[4]+TextRC[4]+50))
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(Width, bi, 4, "uint")
NumPut(Height, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm)
DllCall("Gdiplus\GdipCreateFromHDC2", "UPtr", hDC, "UPtr", "", "UPtr*", G)
DllCall("gdiplus\GdipSetSmoothingMode", "UPtr", G, "int", 2)
;绘背景色
DllCall("gdiplus\GdipCreateSolidFill", "UInt", "0x" Format("{:02x}",Transparent) (Dark?"000000":"f0f0f0"), "UPtr*", pBrush)
DllCall("gdiplus\GdipCreateRegion", "UInt*", Region)
DllCall("gdiplus\GdipGetClip", "UPtr", G, "UInt", Region)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipFillRectangle", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", Width, "float", Height)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipDeleteRegion", "UPtr", Region)
DllCall("gdiplus\GdipGetImageDimension", "UPtr", pBitmap, "float*", ImageWidth:=Width, "float*", ImageHeight:=Height)
ImageWidth := Round(ImageWidth),ImageHeight := Round(ImageHeight)
DllCall("gdiplus\GdipDrawImageRectRect", "UPtr", G, "UPtr", pBitmap, "float", 15, "float", Abs(Height-ImageHeight)/2
, "float", Width, "float", Height, "float", 0, "float", 0, "float", Width, "float", Height, "int", 2
, "UPtr", 0, "UPtr", 0, "UPtr", 0)
;;绘文字
TitleRC:=StrSplit(TextToGraphics_Gdip(G,title, "x" ImageWidth+30 " y" Abs(Height-TitleRC[4]-TextRC[4]-10)/2 " cff" (Dark?"f0f0f0":"333333") " s" TitleFntSize (text=""&&title<>""?"":" Bold "), SystemFontName, TitleRC[3]+30, TitleRC[4]),"|")
TextRC:=StrSplit(TextToGraphics_Gdip(G,Text, "x" TitleRC[1] " y" TitleRC[2]+TitleRC[4]+5 " cff" (Dark?"e3e3e3":"454545") " s" TextFntSize " ", SystemFontName, TextRC[3]+15, TextRC[4]),"|")
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
WinGetPos,TrayWndX,TrayWndY,TrayWndW,TrayWndH,ahk_class Shell_TrayWnd
Loop,% Width
{
xpos:=TrayWndW>TrayWndH?A_ScreenWidth-A_Index-15:TrayWndX>0?A_Index+30-Width:A_ScreenWidth-A_Index-30
ypos:=TrayWndW>TrayWndH?TrayWndY>0?A_ScreenHeight-TrayWndH-Height-15:TrayWndH+15:A_ScreenHeight-TrayWndW-Height-15
if ((xpos != "") && (ypos != ""))
VarSetCapacity(pt, 8), NumPut(xpos, pt, 0, "UInt"), NumPut(ypos, pt, 4, "UInt")
if (Width = "") || (Height = ""){
size := VarSetCapacity(rect, 16, 0)
er := DllCall("dwmapi\DwmGetWindowAttribute"
, "UPtr", hCTT, "UInt", 9, "UPtr", &rect, "UInt", size, "UInt")
If er
DllCall("GetWindowRect", "UPtr", hCTT, "UPtr", &rect, "UInt")
r := []
r.x1 := NumGet(rect, 0, "Int"), r.y1 := NumGet(rect, 4, "Int")
r.x2 := NumGet(rect, 8, "Int"), r.y2 := NumGet(rect, 12, "Int")
r.w := Abs(max(r.x1, r.x2) - min(r.x1, r.x2))
r.h := Abs(max(r.y1, r.y2) - min(r.y1, r.y2))
Width := r.w
Height := r.h
}
DllCall("UpdateLayeredWindow", "UPtr", hCTT, "UPtr", 0, "UPtr", ((xpos = "") && (ypos = "")) ? 0 : &pt
, "int64*", Width|Height<<32, "UPtr", hdc, "int64*", 0, "uint", 0, "UInt*", 255<<16|1<<24, "uint", 2)
}
DllCall("SelectObject", "UPtr", hdc, "UPtr", obm),DllCall("DeleteObject", "UPtr", hbm)
DllCall("DeleteDC", "UPtr", hdc),DllCall("gdiplus\GdipDeleteGraphics", "UPtr", G)
OnMessage(0x201, "CloseCustomTrayTip")
if timeout {
CTTimer := Func("DllCall").Bind("DestroyWindow", "Ptr", hCTT)
SetTimer, % CTTimer, % "-" . timeout
}
Return WinExist("ahk_id " hCTT)?{HWND:hCTT,x:xpos,y:ypos,w:Width,h:Height}:False
;;格式化字符串自动换行,以免过长
FormatString:
loopString:=text=""&&title<>""?title:text
if !InStr(loopString,"`n"){
Index:=0,String:=""
Loop,Parse,loopString
{
Index:=A_LoopField~="[\x00-\xff]"?Index+1:Index+2
String:=Mod(Index,44)=0||Mod(Index,44)=1?String "`n" A_LoopField:String A_LoopField
String:=RegExReplace(String,"(\n.)[\r\n]","$1")
}
if (text=""&&title<>"")
title:= String<>""?String:title
Else{
Text:= String<>""?String:Text
}
}
Return
}
CloseCustomTrayTip(wParam, lParam, uMsg, hWnd){
Global hCTT,CTTimer
DetectHiddenWindows,Off
if (A_Gui="TT"&&wParam){
Try {
SetTimer, % CTTimer,Off
DllCall("DestroyWindow","ptr",hWnd)
;;DllCall("user32.dll\PostMessage", "ptr", hWnd, "uint", 0x00A1, "ptr", 2, "ptr", 0)
}
}
DetectHiddenWindows,On
}
TextToGraphics_Gdip(pGraphics, Text, Options, Font:="Arial", Width:="", Height:="", Measure:=0, userBrush:=0, Unit:=0) {
Static Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
, Alignments := "Near|Left|Centre|Center|Far|Right"
OWidth := Width,IWidth := Width, IHeight:= Height
pattern_opts := (A_AhkVersion < "2") ? "iO)" : "i)"
RegExMatch(Options, pattern_opts "X([\-\d\.]+)(p*)", xpos)
RegExMatch(Options, pattern_opts "Y([\-\d\.]+)(p*)", ypos)
RegExMatch(Options, pattern_opts "W([\-\d\.]+)(p*)", PWidth)
RegExMatch(Options, pattern_opts "H([\-\d\.]+)(p*)", Height)
RegExMatch(Options, pattern_opts "C(?!(entre|enter))([a-f\d]+)", Colour)
RegExMatch(Options, pattern_opts "Top|Up|Bottom|Down|vCentre|vCenter", vPos)
RegExMatch(Options, pattern_opts "NoWrap", NoWrap)
RegExMatch(Options, pattern_opts "R(\d)", Rendering)
RegExMatch(Options, pattern_opts "S(\d+)(p*)", Size)
Width := PWidth
DllCall("gdiplus\GdipCloneBrush", "UPtr", Colour[2], "UPtr*", pBrushClone)
if Colour && !DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrushClone){
Static Integer := "Integer"
if Colour[2] is Integer
PassBrush := 1,pBrush := Colour[2]
}
if !(IWidth && IHeight) && ((xpos && xpos[2]) || (ypos && ypos[2]) || (Width && Width[2]) || (Height && Height[2]) || (Size && Size[2]))
return -1
Style := 0
For eachStyle, valStyle in StrSplit(Styles, "|")
{
if RegExMatch(Options, "\b" valStyle)
Style |= (valStyle != "StrikeOut") ? (A_Index-1) : 8
}
Align := 0
For eachAlignment, valAlignment in StrSplit(Alignments, "|")
{
if RegExMatch(Options, "\b" valAlignment)
Align |= A_Index//2.1 ; 0|0|1|1|2|2
}
xpos := (xpos && (xpos[1] != "")) ? xpos[2] ? IWidth*(xpos[1]/100) : xpos[1] : 0
ypos := (ypos && (ypos[1] != "")) ? ypos[2] ? IHeight*(ypos[1]/100) : ypos[1] : 0
Width := (Width && Width[1]) ? Width[2] ? IWidth*(Width[1]/100) : Width[1] : IWidth
Height := (Height && Height[1]) ? Height[2] ? IHeight*(Height[1]/100) : Height[1] : IHeight
If !PassBrush
Colour := "0x" (Colour && Colour[2] ? Colour[2] : "ff000000")
Rendering := (Rendering && (Rendering[1] >= 0) && (Rendering[1] <= 5)) ? Rendering[1] : 4
Size := (Size && (Size[1] > 0)) ? Size[2] ? IHeight*(Size[1]/100) : Size[1] : 12
If RegExMatch(Font, "^(.\:\\.)")
{
DllCall("gdiplus\GdipNewPrivateFontCollection", "ptr*", hFontCollection)
hFontFamily := 0
E := DllCall("gdiplus\GdipPrivateAddFontFile", "ptr", hFontCollection, "str", Font)
if !E {
VarSetCapacity(pFontFamily, 10, 0)
DllCall("gdiplus\GdipGetFontCollectionFamilyList", "ptr", hFontCollection, "int", 1, "ptr", &pFontFamily, "int*", found)
VarSetCapacity(FontName, 100)
DllCall("gdiplus\GdipGetFamilyName", "ptr", NumGet(pFontFamily, 0, "ptr"), "str", FontName, "ushort", 1033)
}
} Else DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", Font, "uint", 0, "UPtr*", hFontFamily)
If !hFontFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFontFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFontFamily, "float", Size, "int", Style, "int", Unit, "UPtr*", hFont)
DllCall("gdiplus\GdipCreateStringFormat", "int", NoWrap ? 0x4000 | 0x1000 : 0x4000, "int", 0, "UPtr*", hStringFormat)
If !hStringFormat
DllCall("gdiplus\GdipStringFormatGetGenericTypographic", "UPtr*", hStringFormat)
if !PassBrush
DllCall("gdiplus\GdipCreateSolidFill", "UInt", Colour, "UPtr*", pBrush)
if !(hFontFamily && hFont && hStringFormat && pBrush && pGraphics)
{
E := !pGraphics ? -2 : !hFontFamily ? -3 : !hFont ? -4 : !hStringFormat ? -5 : !pBrush ? -6 : 0
If pBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
If hStringFormat
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
If hFont
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
If hFontFamily
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return E
}
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
DllCall("gdiplus\GdipSetStringFormatAlign", "UPtr", hStringFormat, "int", Align)
If InStr(Options, "autotrim")
DllCall("gdiplus\GdipSetStringFormatTrimming", "UPtr", hStringFormat, "int", 3)
DllCall("gdiplus\GdipSetTextRenderingHint", "UPtr", pGraphics, "int", Rendering)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
ReturnRCtest := StrSplit(ReturnRC, "|")
testX := Floor(ReturnRCtest[1]) - 2
If (testX>xpos && NoWrap && (PWidth>2 || OWidth>2))
{
nxpos := Floor(xpos - (testX - xpos))
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
If vPos
{
ReturnRC := StrSplit(ReturnRC, "|")
if (vPos[0] = "vCentre") || (vPos[0] = "vCenter")
ypos += (Height-ReturnRC[4])//2
else if (vPos[0] = "Top") || (vPos[0] = "Up")
ypos += 0
else if (vPos[0] = "Bottom") || (vPos[0] = "Down")
ypos += Height-ReturnRC[4]
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(ReturnRC[4], RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
thisBrush := userBrush ? userBrush : pBrush
if !Measure
_E := DllCall("gdiplus\GdipDrawString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", thisBrush)
if !PassBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return _E ? _E : ReturnRC
}
Exit:
DllCall("gdiplus\GdiplusShutdown", "UPtr", CTToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("FreeLibrary", "UPtr", hModule)
ExitApp
Return
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
OnExit, Exit
CustomTrayTip("消息通知:","仿win10 TrayTip通知样式,可用在win7或托盘图标隐藏的脚本上!",1,True)
Sleep,4000
ExitApp
Return
;;;================================================================================================
/* ; By 蜜獾哥
仿win10 TrayTip通知,可用在win7或托盘图标隐藏的脚本上!
title:标题
text:内容
Mode:1消息,2警告,3错误
Dark:true深色模式,False浅色模式
Transparent:透明度[0-255],0透明,255不透明
Timeout:显示时长
*/
CustomTrayTip(title,text:="",Mode=1,Dark:=True,Transparent:=225,Timeout:=3500){
;;Critical
Global CTToken,hCTT,CTTimer
Static Index
if (title=""&&text=""){
Return
}
Gosub FormatString
TitleFntSize:=22,TextFntSize:=20,Transparent:=Transparent>255?255:Transparent<0?0:Transparent
NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
SystemFontName:=StrGet(&info + 52)?StrGet(&info + 52):"宋体"
if !DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UPtr*", CTToken, "UPtr", &si, "UPtr", 0)
If !CTToken
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
Gui, TT: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs +HWNDhCTT -DPIScale
Gui, TT: Show, NA
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(1, bi, 4, "uint")
NumPut(1, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm), DllCall("gdiplus\GdipCreateFromHDC", "UPtr", hdc, "UPtr*", G)
DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", SystemFontName, "uint", 0, "UPtr*", hFamily)
If !hFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TitleFntSize, "int", text=""&&title<>""?0:1, "int", 0, "UPtr*", tFont)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TextFntSize, "int", 0, "int", 0, "UPtr*", hFont)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", tFormat)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", hFormat)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", title, "int", -1, "UPtr"
, tFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TitleRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", Text, "int", -1, "UPtr"
, hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TextRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
base64_1=
(join`r`n LTrim
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABMVJREFUeF7tm02IHEUUx/+vdyN+BrZHo
h4Mxp3uJQGPJnrQQ7KKB00O4kEURPBjtyYnAyqKHhTFCHrK1q4fIIKoJyGJAdHVgx408ZiD7PRsIuZgEu1e8DPETT/puGN2Z7qnq7urqxtmF/qy86rqvd+8e
l0f/yEM+R8NefxYB7CeAQYIjMmFOwDrHgI2RQ8zXwdg08oTeXA2eojoDANnowcIP1sSE9+U7V5pU6Axt7gLzHcz84MAbswZyCki+ghEn/tT41/m7GNgM60Ar
jnwQ2MDjQiQ9TDArl6HqQ0OP/iHL8jf9271dfWtBcBN7528/Le/lwURBDPGdTkX1w8RFpkhN14xKn98dMu5omMVBjAm21PEJEC4pagzmdozjjOxXBLuXKZ2P
caFANiy/RZATxRxoHhbfjsQ7pN5+8kNwJadLwCezDuw3nY0H4jmXXn6zAXAlt4igJvzDFhimxOBcDLXn8wAbOlxiUEU7joQTqaYMhnbsnMM4FsLe1lqB/R9I
JrbVYdQBtCY9WaYIVQ7rtKOCNKfdloqPigBaMj2awx6RqXDutgQeL8v3GfT/EkFcPE9D5pN6yjr571ztYzawuDptHXCQAAXV3h/LR8rY5FjAgAYxzdeObp90
IpxIABbek8BeCPrt6tibwTAf47sC4TzZpJPiQCijc1lI6NHy1rbmwIQ7R3OX1jekbSBSgRgz7RfANFLKt9m7W2YXwxa7stxfiYCaEivwyh3Z2cKHAGLvnCay
gCuld7uEDhoykET41jAnl+Fc6h3rNgMsKX3DoDHTDhmcIx3A+E8rgrgZwDXl+cczQN0ZMTCkV+mxr1onDLWAT3+nw6Ec0MqgMaBhV1sWfNagyc6A+bDFIYf+
3snYs/2DAAAheFk7/h9U2BMeq8Q8JwuAKq7MxMAGHh1STjPr46tD4Du+U9s3e+3xj9JA2oCAIC+OtAHoCG9gwzsTnNY9XMCf+gL96HV9vacd3sw5Xy75n8Gz
hkIOOQLZ8/gDJhpfweiHaoBKtidO7+MzRtG8AAR7wTRVjC2mVoJrvGP+WjQcm9LA3ACRFsUAitkUhGAk0HLXXOU118DZtp/gOiqQtEpNK4IwJ9By706LQOGH
sDQTwHdRTB2QlQ0BdKLoO7XYFI5qAKA2mvQ0EaoCgBKCyHdS+E6ZYDSUjhScxCsrxXeZIVMqsgARnhnr+ok6TzgpwKqDiUwFQA4FQhnc+p2ODJozHb2M/PTS
pHkNDINgIhe96ebfZc7sRkQ6Xs4DPWeCfSAMg7AsibjdEbJp8Kys6Bf53OJglkA1A5EcyIuWSs7FjcKIM+xuK6LEdUToaRSUvSgJPfFSOSQjquxqgHkvhqLA
Oi4HK0UQNHL0QhC0evxKgEUvh7vzst6yOGyLjjU5HOpAolLEOoki0uDoS6bUwawUhTrKI/rpZFJLpcJwAqE4ZXJrZoONZTLZZPHdWPJnAHdhnWSzWWRxSntB
tNKzP8QaiCfU5XDJcWUOwO6HQ61XL4LYah/MLE6tbo/mSGiR3TriyKdDzO/X8ufzMTNrxWd0X0A7i2gNjkN4FMLOByn71GtVYPsCtcAFSci1UloWTuz/GzOC
sOvktQkKmOq2hgBoOpMFXbrAKqgXqcxhz4D/gVkGDdfoNgmzwAAAABJRU5ErkJggg==
)
base64_2=
(join`r`n LTrim
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
)
base64_3=
(join`r`n LTrim
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
)
Base64:=Mode=3?base64_3:Mode=2?base64_2:base64_1
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
VarSetCapacity(Dec, DecLen, 0)
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"), "PtrP", pBitmap)
;;78感叹号,155问号,110
;;pBitmap := Gdip_CreateBitmapFromFile("shell32.dll" ,Mode=3?110:Mode=2?78:278,40)
DllCall("gdiplus\GdipGetImageWidth", "UPtr", pBitmap, "uint*", ImageWidth)
DllCall("gdiplus\GdipGetImageHeight", "UPtr", pBitmap, "uint*", ImageHeight)
Width := Max(Width:=320,ImageWidth+Max(TitleRC[3]+15,TextRC[3]+15)+40), Height := Max(Height:=120,Max(ImageHeight+50,TitleRC[4]+TextRC[4]+50))
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(Width, bi, 4, "uint")
NumPut(Height, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm)
DllCall("Gdiplus\GdipCreateFromHDC2", "UPtr", hDC, "UPtr", "", "UPtr*", G)
DllCall("gdiplus\GdipSetSmoothingMode", "UPtr", G, "int", 2)
;绘背景色
DllCall("gdiplus\GdipCreateSolidFill", "UInt", "0x" Format("{:02x}",Transparent) (Dark?"000000":"f0f0f0"), "UPtr*", pBrush)
DllCall("gdiplus\GdipCreateRegion", "UInt*", Region)
DllCall("gdiplus\GdipGetClip", "UPtr", G, "UInt", Region)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipFillRectangle", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", Width, "float", Height)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipDeleteRegion", "UPtr", Region)
DllCall("gdiplus\GdipGetImageDimension", "UPtr", pBitmap, "float*", ImageWidth:=Width, "float*", ImageHeight:=Height)
ImageWidth := Round(ImageWidth),ImageHeight := Round(ImageHeight)
DllCall("gdiplus\GdipDrawImageRectRect", "UPtr", G, "UPtr", pBitmap, "float", 15, "float", Abs(Height-ImageHeight)/2
, "float", Width, "float", Height, "float", 0, "float", 0, "float", Width, "float", Height, "int", 2
, "UPtr", 0, "UPtr", 0, "UPtr", 0)
;;绘文字
TitleRC:=StrSplit(TextToGraphics_Gdip(G,title, "x" ImageWidth+30 " y" Abs(Height-TitleRC[4]-TextRC[4]-10)/2 " cff" (Dark?"f0f0f0":"333333") " s" TitleFntSize (text=""&&title<>""?"":" Bold "), SystemFontName, TitleRC[3]+30, TitleRC[4]),"|")
TextRC:=StrSplit(TextToGraphics_Gdip(G,Text, "x" TitleRC[1] " y" TitleRC[2]+TitleRC[4]+5 " cff" (Dark?"e3e3e3":"454545") " s" TextFntSize " ", SystemFontName, TextRC[3]+15, TextRC[4]),"|")
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
WinGetPos,TrayWndX,TrayWndY,TrayWndW,TrayWndH,ahk_class Shell_TrayWnd
Loop,% Width
{
xpos:=TrayWndW>TrayWndH?A_ScreenWidth-A_Index-15:TrayWndX>0?A_Index+30-Width:A_ScreenWidth-A_Index-30
ypos:=TrayWndW>TrayWndH?TrayWndY>0?A_ScreenHeight-TrayWndH-Height-15:TrayWndH+15:A_ScreenHeight-TrayWndW-Height-15
if ((xpos != "") && (ypos != ""))
VarSetCapacity(pt, 8), NumPut(xpos, pt, 0, "UInt"), NumPut(ypos, pt, 4, "UInt")
if (Width = "") || (Height = ""){
size := VarSetCapacity(rect, 16, 0)
er := DllCall("dwmapi\DwmGetWindowAttribute"
, "UPtr", hCTT, "UInt", 9, "UPtr", &rect, "UInt", size, "UInt")
If er
DllCall("GetWindowRect", "UPtr", hCTT, "UPtr", &rect, "UInt")
r := []
r.x1 := NumGet(rect, 0, "Int"), r.y1 := NumGet(rect, 4, "Int")
r.x2 := NumGet(rect, 8, "Int"), r.y2 := NumGet(rect, 12, "Int")
r.w := Abs(max(r.x1, r.x2) - min(r.x1, r.x2))
r.h := Abs(max(r.y1, r.y2) - min(r.y1, r.y2))
Width := r.w
Height := r.h
}
DllCall("UpdateLayeredWindow", "UPtr", hCTT, "UPtr", 0, "UPtr", ((xpos = "") && (ypos = "")) ? 0 : &pt
, "int64*", Width|Height<<32, "UPtr", hdc, "int64*", 0, "uint", 0, "UInt*", 255<<16|1<<24, "uint", 2)
}
DllCall("SelectObject", "UPtr", hdc, "UPtr", obm),DllCall("DeleteObject", "UPtr", hbm)
DllCall("DeleteDC", "UPtr", hdc),DllCall("gdiplus\GdipDeleteGraphics", "UPtr", G)
OnMessage(0x201, "CloseCustomTrayTip")
if timeout {
CTTimer := Func("DllCall").Bind("DestroyWindow", "Ptr", hCTT)
SetTimer, % CTTimer, % "-" . timeout
}
Return WinExist("ahk_id " hCTT)?{HWND:hCTT,x:xpos,y:ypos,w:Width,h:Height}:False
;;格式化字符串自动换行,以免过长
FormatString:
loopString:=text=""&&title<>""?title:text
if !InStr(loopString,"`n"){
Index:=0,String:=""
Loop,Parse,loopString
{
Index:=A_LoopField~="[\x00-\xff]"?Index+1:Index+2
String:=Mod(Index,44)=0||Mod(Index,44)=1?String "`n" A_LoopField:String A_LoopField
String:=RegExReplace(String,"(\n.)[\r\n]","$1")
}
if (text=""&&title<>"")
title:= String<>""?String:title
Else{
Text:= String<>""?String:Text
}
}
Return
}
CloseCustomTrayTip(wParam, lParam, uMsg, hWnd){
Global hCTT,CTTimer
DetectHiddenWindows,Off
if (A_Gui="TT"&&wParam){
Try {
SetTimer, % CTTimer,Off
DllCall("DestroyWindow","ptr",hWnd)
;;DllCall("user32.dll\PostMessage", "ptr", hWnd, "uint", 0x00A1, "ptr", 2, "ptr", 0)
}
}
DetectHiddenWindows,On
}
TextToGraphics_Gdip(pGraphics, Text, Options, Font:="Arial", Width:="", Height:="", Measure:=0, userBrush:=0, Unit:=0) {
Static Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
, Alignments := "Near|Left|Centre|Center|Far|Right"
OWidth := Width,IWidth := Width, IHeight:= Height
pattern_opts := (A_AhkVersion < "2") ? "iO)" : "i)"
RegExMatch(Options, pattern_opts "X([\-\d\.]+)(p*)", xpos)
RegExMatch(Options, pattern_opts "Y([\-\d\.]+)(p*)", ypos)
RegExMatch(Options, pattern_opts "W([\-\d\.]+)(p*)", PWidth)
RegExMatch(Options, pattern_opts "H([\-\d\.]+)(p*)", Height)
RegExMatch(Options, pattern_opts "C(?!(entre|enter))([a-f\d]+)", Colour)
RegExMatch(Options, pattern_opts "Top|Up|Bottom|Down|vCentre|vCenter", vPos)
RegExMatch(Options, pattern_opts "NoWrap", NoWrap)
RegExMatch(Options, pattern_opts "R(\d)", Rendering)
RegExMatch(Options, pattern_opts "S(\d+)(p*)", Size)
Width := PWidth
DllCall("gdiplus\GdipCloneBrush", "UPtr", Colour[2], "UPtr*", pBrushClone)
if Colour && !DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrushClone){
Static Integer := "Integer"
if Colour[2] is Integer
PassBrush := 1,pBrush := Colour[2]
}
if !(IWidth && IHeight) && ((xpos && xpos[2]) || (ypos && ypos[2]) || (Width && Width[2]) || (Height && Height[2]) || (Size && Size[2]))
return -1
Style := 0
For eachStyle, valStyle in StrSplit(Styles, "|")
{
if RegExMatch(Options, "\b" valStyle)
Style |= (valStyle != "StrikeOut") ? (A_Index-1) : 8
}
Align := 0
For eachAlignment, valAlignment in StrSplit(Alignments, "|")
{
if RegExMatch(Options, "\b" valAlignment)
Align |= A_Index//2.1 ; 0|0|1|1|2|2
}
xpos := (xpos && (xpos[1] != "")) ? xpos[2] ? IWidth*(xpos[1]/100) : xpos[1] : 0
ypos := (ypos && (ypos[1] != "")) ? ypos[2] ? IHeight*(ypos[1]/100) : ypos[1] : 0
Width := (Width && Width[1]) ? Width[2] ? IWidth*(Width[1]/100) : Width[1] : IWidth
Height := (Height && Height[1]) ? Height[2] ? IHeight*(Height[1]/100) : Height[1] : IHeight
If !PassBrush
Colour := "0x" (Colour && Colour[2] ? Colour[2] : "ff000000")
Rendering := (Rendering && (Rendering[1] >= 0) && (Rendering[1] <= 5)) ? Rendering[1] : 4
Size := (Size && (Size[1] > 0)) ? Size[2] ? IHeight*(Size[1]/100) : Size[1] : 12
If RegExMatch(Font, "^(.\:\\.)")
{
DllCall("gdiplus\GdipNewPrivateFontCollection", "ptr*", hFontCollection)
hFontFamily := 0
E := DllCall("gdiplus\GdipPrivateAddFontFile", "ptr", hFontCollection, "str", Font)
if !E {
VarSetCapacity(pFontFamily, 10, 0)
DllCall("gdiplus\GdipGetFontCollectionFamilyList", "ptr", hFontCollection, "int", 1, "ptr", &pFontFamily, "int*", found)
VarSetCapacity(FontName, 100)
DllCall("gdiplus\GdipGetFamilyName", "ptr", NumGet(pFontFamily, 0, "ptr"), "str", FontName, "ushort", 1033)
}
} Else DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", Font, "uint", 0, "UPtr*", hFontFamily)
If !hFontFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFontFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFontFamily, "float", Size, "int", Style, "int", Unit, "UPtr*", hFont)
DllCall("gdiplus\GdipCreateStringFormat", "int", NoWrap ? 0x4000 | 0x1000 : 0x4000, "int", 0, "UPtr*", hStringFormat)
If !hStringFormat
DllCall("gdiplus\GdipStringFormatGetGenericTypographic", "UPtr*", hStringFormat)
if !PassBrush
DllCall("gdiplus\GdipCreateSolidFill", "UInt", Colour, "UPtr*", pBrush)
if !(hFontFamily && hFont && hStringFormat && pBrush && pGraphics)
{
E := !pGraphics ? -2 : !hFontFamily ? -3 : !hFont ? -4 : !hStringFormat ? -5 : !pBrush ? -6 : 0
If pBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
If hStringFormat
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
If hFont
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
If hFontFamily
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return E
}
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
DllCall("gdiplus\GdipSetStringFormatAlign", "UPtr", hStringFormat, "int", Align)
If InStr(Options, "autotrim")
DllCall("gdiplus\GdipSetStringFormatTrimming", "UPtr", hStringFormat, "int", 3)
DllCall("gdiplus\GdipSetTextRenderingHint", "UPtr", pGraphics, "int", Rendering)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
ReturnRCtest := StrSplit(ReturnRC, "|")
testX := Floor(ReturnRCtest[1]) - 2
If (testX>xpos && NoWrap && (PWidth>2 || OWidth>2))
{
nxpos := Floor(xpos - (testX - xpos))
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
If vPos
{
ReturnRC := StrSplit(ReturnRC, "|")
if (vPos[0] = "vCentre") || (vPos[0] = "vCenter")
ypos += (Height-ReturnRC[4])//2
else if (vPos[0] = "Top") || (vPos[0] = "Up")
ypos += 0
else if (vPos[0] = "Bottom") || (vPos[0] = "Down")
ypos += Height-ReturnRC[4]
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(ReturnRC[4], RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
thisBrush := userBrush ? userBrush : pBrush
if !Measure
_E := DllCall("gdiplus\GdipDrawString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", thisBrush)
if !PassBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return _E ? _E : ReturnRC
}
Exit:
DllCall("gdiplus\GdiplusShutdown", "UPtr", CTToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("FreeLibrary", "UPtr", hModule)
ExitApp
Return
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
OnExit, Exit
CustomTrayTip("消息通知:","仿win10 TrayTip通知样式,可用在win7或托盘图标隐藏的脚本上!",1,True)
Sleep,4000
ExitApp
Return
;;;================================================================================================
/* ; By 蜜獾哥
仿win10 TrayTip通知,可用在win7或托盘图标隐藏的脚本上!
title:标题
text:内容
Mode:1消息,2警告,3错误
Dark:true深色模式,False浅色模式
Transparent:透明度[0-255],0透明,255不透明
Timeout:显示时长
*/
CustomTrayTip(title,text:="",Mode=1,Dark:=True,Transparent:=225,Timeout:=3500){
;;Critical
Global CTToken,hCTT,CTTimer
Static Index
if (title=""&&text=""){
Return
}
Gosub FormatString
TitleFntSize:=22,TextFntSize:=20,Transparent:=Transparent>255?255:Transparent<0?0:Transparent
NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
SystemFontName:=StrGet(&info + 52)?StrGet(&info + 52):"宋体"
if !DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
DllCall("gdiplus\GdiplusStartup", "UPtr*", CTToken, "UPtr", &si, "UPtr", 0)
If !CTToken
{
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
ExitApp
}
Gui, TT: -Caption +E0x80000 +LastFound +AlwaysOnTop +ToolWindow +OwnDialogs +HWNDhCTT -DPIScale
Gui, TT: Show, NA
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(1, bi, 4, "uint")
NumPut(1, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm), DllCall("gdiplus\GdipCreateFromHDC", "UPtr", hdc, "UPtr*", G)
DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", SystemFontName, "uint", 0, "UPtr*", hFamily)
If !hFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TitleFntSize, "int", text=""&&title<>""?0:1, "int", 0, "UPtr*", tFont)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFamily, "float", TextFntSize, "int", 0, "int", 0, "UPtr*", hFont)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", tFormat)
DllCall("gdiplus\GdipStringFormatGetGenericDefault", "UPtr*", hFormat)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", title, "int", -1, "UPtr"
, tFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TitleRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", G, "WStr", Text, "int", -1, "UPtr"
, hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
TextRC:=[NumGet(TempRC, 0, "float"),NumGet(TempRC, 4, "float"),NumGet(TempRC, 8, "float"),NumGet(TempRC, 12, "float")]
base64_1=
(join`r`n LTrim
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABMVJREFUeF7tm02IHEUUx/+vdyN+BrZHo
h4Mxp3uJQGPJnrQQ7KKB00O4kEURPBjtyYnAyqKHhTFCHrK1q4fIIKoJyGJAdHVgx408ZiD7PRsIuZgEu1e8DPETT/puGN2Z7qnq7urqxtmF/qy86rqvd+8e
l0f/yEM+R8NefxYB7CeAQYIjMmFOwDrHgI2RQ8zXwdg08oTeXA2eojoDANnowcIP1sSE9+U7V5pU6Axt7gLzHcz84MAbswZyCki+ghEn/tT41/m7GNgM60Ar
jnwQ2MDjQiQ9TDArl6HqQ0OP/iHL8jf9271dfWtBcBN7528/Le/lwURBDPGdTkX1w8RFpkhN14xKn98dMu5omMVBjAm21PEJEC4pagzmdozjjOxXBLuXKZ2P
caFANiy/RZATxRxoHhbfjsQ7pN5+8kNwJadLwCezDuw3nY0H4jmXXn6zAXAlt4igJvzDFhimxOBcDLXn8wAbOlxiUEU7joQTqaYMhnbsnMM4FsLe1lqB/R9I
JrbVYdQBtCY9WaYIVQ7rtKOCNKfdloqPigBaMj2awx6RqXDutgQeL8v3GfT/EkFcPE9D5pN6yjr571ztYzawuDptHXCQAAXV3h/LR8rY5FjAgAYxzdeObp90
IpxIABbek8BeCPrt6tibwTAf47sC4TzZpJPiQCijc1lI6NHy1rbmwIQ7R3OX1jekbSBSgRgz7RfANFLKt9m7W2YXwxa7stxfiYCaEivwyh3Z2cKHAGLvnCay
gCuld7uEDhoykET41jAnl+Fc6h3rNgMsKX3DoDHTDhmcIx3A+E8rgrgZwDXl+cczQN0ZMTCkV+mxr1onDLWAT3+nw6Ec0MqgMaBhV1sWfNagyc6A+bDFIYf+
3snYs/2DAAAheFk7/h9U2BMeq8Q8JwuAKq7MxMAGHh1STjPr46tD4Du+U9s3e+3xj9JA2oCAIC+OtAHoCG9gwzsTnNY9XMCf+gL96HV9vacd3sw5Xy75n8Gz
hkIOOQLZ8/gDJhpfweiHaoBKtidO7+MzRtG8AAR7wTRVjC2mVoJrvGP+WjQcm9LA3ACRFsUAitkUhGAk0HLXXOU118DZtp/gOiqQtEpNK4IwJ9By706LQOGH
sDQTwHdRTB2QlQ0BdKLoO7XYFI5qAKA2mvQ0EaoCgBKCyHdS+E6ZYDSUjhScxCsrxXeZIVMqsgARnhnr+ok6TzgpwKqDiUwFQA4FQhnc+p2ODJozHb2M/PTS
pHkNDINgIhe96ebfZc7sRkQ6Xs4DPWeCfSAMg7AsibjdEbJp8Kys6Bf53OJglkA1A5EcyIuWSs7FjcKIM+xuK6LEdUToaRSUvSgJPfFSOSQjquxqgHkvhqLA
Oi4HK0UQNHL0QhC0evxKgEUvh7vzst6yOGyLjjU5HOpAolLEOoki0uDoS6bUwawUhTrKI/rpZFJLpcJwAqE4ZXJrZoONZTLZZPHdWPJnAHdhnWSzWWRxSntB
tNKzP8QaiCfU5XDJcWUOwO6HQ61XL4LYah/MLE6tbo/mSGiR3TriyKdDzO/X8ufzMTNrxWd0X0A7i2gNjkN4FMLOByn71GtVYPsCtcAFSci1UloWTuz/GzOC
sOvktQkKmOq2hgBoOpMFXbrAKqgXqcxhz4D/gVkGDdfoNgmzwAAAABJRU5ErkJggg==
)
base64_2=
(join`r`n LTrim
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
)
base64_3=
(join`r`n LTrim
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
)
Base64:=Mode=3?base64_3:Mode=2?base64_2:base64_1
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", 0, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
VarSetCapacity(Dec, DecLen, 0)
DllCall("crypt32\CryptStringToBinary", "UPtr", &Base64, "UInt", 0, "UInt", 0x01, "UPtr", &Dec, "UIntP", DecLen, "UPtr", 0, "UPtr", 0)
DllCall("gdiplus\GdipCreateBitmapFromStreamICM", "UPtr", DllCall("shlwapi\SHCreateMemStream", "UPtr", &Dec, "UInt", DecLen, "UPtr"), "PtrP", pBitmap)
;;78感叹号,155问号,110
;;pBitmap := Gdip_CreateBitmapFromFile("shell32.dll" ,Mode=3?110:Mode=2?78:278,40)
DllCall("gdiplus\GdipGetImageWidth", "UPtr", pBitmap, "uint*", ImageWidth)
DllCall("gdiplus\GdipGetImageHeight", "UPtr", pBitmap, "uint*", ImageHeight)
Width := Max(Width:=320,ImageWidth+Max(TitleRC[3]+15,TextRC[3]+15)+40), Height := Max(Height:=120,Max(ImageHeight+50,TitleRC[4]+TextRC[4]+50))
VarSetCapacity(bi, 40, 0),NumPut(40, bi, 0, "uint"),NumPut(Width, bi, 4, "uint")
NumPut(Height, bi, 8, "uint"),NumPut(1, bi, 12, "ushort"),NumPut(32, bi, 14, "ushort"),NumPut(0, bi, 16, "uInt")
hbm := DllCall("CreateDIBSection", "UPtr", DllCall("GetDC", "UPtr", 0), "UPtr", &bi, "uint", 0, "UPtr*", 0, "UPtr", 0, "uint", 0, "UPtr")
hdc := DllCall("CreateCompatibleDC", "UPtr", 0)
obm := DllCall("SelectObject", "UPtr", hdc, "UPtr", hbm)
DllCall("Gdiplus\GdipCreateFromHDC2", "UPtr", hDC, "UPtr", "", "UPtr*", G)
DllCall("gdiplus\GdipSetSmoothingMode", "UPtr", G, "int", 2)
;绘背景色
DllCall("gdiplus\GdipCreateSolidFill", "UInt", "0x" Format("{:02x}",Transparent) (Dark?"000000":"f0f0f0"), "UPtr*", pBrush)
DllCall("gdiplus\GdipCreateRegion", "UInt*", Region)
DllCall("gdiplus\GdipGetClip", "UPtr", G, "UInt", Region)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", 0, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", Width, "float", Height, "float", 0, "float", 0, "int", 4)
DllCall("gdiplus\GdipFillRectangle", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", Width, "float", Height)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipSetClipRect", "UPtr", G, "float", 0, "float", 0, "float", Width, "float", Height, "int", 4)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", 0, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", 0, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipFillEllipse", "UPtr", G, "UPtr", pBrush, "float", Width, "float", Height, "float", 0, "float", 0)
DllCall("gdiplus\GdipSetClipRegion", "UPtr", G, "UPtr", Region, "int", 0)
DllCall("gdiplus\GdipDeleteRegion", "UPtr", Region)
DllCall("gdiplus\GdipGetImageDimension", "UPtr", pBitmap, "float*", ImageWidth:=Width, "float*", ImageHeight:=Height)
ImageWidth := Round(ImageWidth),ImageHeight := Round(ImageHeight)
DllCall("gdiplus\GdipDrawImageRectRect", "UPtr", G, "UPtr", pBitmap, "float", 15, "float", Abs(Height-ImageHeight)/2
, "float", Width, "float", Height, "float", 0, "float", 0, "float", Width, "float", Height, "int", 2
, "UPtr", 0, "UPtr", 0, "UPtr", 0)
;;绘文字
TitleRC:=StrSplit(TextToGraphics_Gdip(G,title, "x" ImageWidth+30 " y" Abs(Height-TitleRC[4]-TextRC[4]-10)/2 " cff" (Dark?"f0f0f0":"333333") " s" TitleFntSize (text=""&&title<>""?"":" Bold "), SystemFontName, TitleRC[3]+30, TitleRC[4]),"|")
TextRC:=StrSplit(TextToGraphics_Gdip(G,Text, "x" TitleRC[1] " y" TitleRC[2]+TitleRC[4]+5 " cff" (Dark?"e3e3e3":"454545") " s" TextFntSize " ", SystemFontName, TextRC[3]+15, TextRC[4]),"|")
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
WinGetPos,TrayWndX,TrayWndY,TrayWndW,TrayWndH,ahk_class Shell_TrayWnd
Loop,% Width
{
xpos:=TrayWndW>TrayWndH?A_ScreenWidth-A_Index-15:TrayWndX>0?A_Index+30-Width:A_ScreenWidth-A_Index-30
ypos:=TrayWndW>TrayWndH?TrayWndY>0?A_ScreenHeight-TrayWndH-Height-15:TrayWndH+15:A_ScreenHeight-TrayWndW-Height-15
if ((xpos != "") && (ypos != ""))
VarSetCapacity(pt, 8), NumPut(xpos, pt, 0, "UInt"), NumPut(ypos, pt, 4, "UInt")
if (Width = "") || (Height = ""){
size := VarSetCapacity(rect, 16, 0)
er := DllCall("dwmapi\DwmGetWindowAttribute"
, "UPtr", hCTT, "UInt", 9, "UPtr", &rect, "UInt", size, "UInt")
If er
DllCall("GetWindowRect", "UPtr", hCTT, "UPtr", &rect, "UInt")
r := []
r.x1 := NumGet(rect, 0, "Int"), r.y1 := NumGet(rect, 4, "Int")
r.x2 := NumGet(rect, 8, "Int"), r.y2 := NumGet(rect, 12, "Int")
r.w := Abs(max(r.x1, r.x2) - min(r.x1, r.x2))
r.h := Abs(max(r.y1, r.y2) - min(r.y1, r.y2))
Width := r.w
Height := r.h
}
DllCall("UpdateLayeredWindow", "UPtr", hCTT, "UPtr", 0, "UPtr", ((xpos = "") && (ypos = "")) ? 0 : &pt
, "int64*", Width|Height<<32, "UPtr", hdc, "int64*", 0, "uint", 0, "UInt*", 255<<16|1<<24, "uint", 2)
}
DllCall("SelectObject", "UPtr", hdc, "UPtr", obm),DllCall("DeleteObject", "UPtr", hbm)
DllCall("DeleteDC", "UPtr", hdc),DllCall("gdiplus\GdipDeleteGraphics", "UPtr", G)
OnMessage(0x201, "CloseCustomTrayTip")
if timeout {
CTTimer := Func("DllCall").Bind("DestroyWindow", "Ptr", hCTT)
SetTimer, % CTTimer, % "-" . timeout
}
Return WinExist("ahk_id " hCTT)?{HWND:hCTT,x:xpos,y:ypos,w:Width,h:Height}:False
;;格式化字符串自动换行,以免过长
FormatString:
loopString:=text=""&&title<>""?title:text
if !InStr(loopString,"`n"){
Index:=0,String:=""
Loop,Parse,loopString
{
Index:=A_LoopField~="[\x00-\xff]"?Index+1:Index+2
String:=Mod(Index,44)=0||Mod(Index,44)=1?String "`n" A_LoopField:String A_LoopField
String:=RegExReplace(String,"(\n.)[\r\n]","$1")
}
if (text=""&&title<>"")
title:= String<>""?String:title
Else{
Text:= String<>""?String:Text
}
}
Return
}
CloseCustomTrayTip(wParam, lParam, uMsg, hWnd){
Global hCTT,CTTimer
DetectHiddenWindows,Off
if (A_Gui="TT"&&wParam){
Try {
SetTimer, % CTTimer,Off
DllCall("DestroyWindow","ptr",hWnd)
;;DllCall("user32.dll\PostMessage", "ptr", hWnd, "uint", 0x00A1, "ptr", 2, "ptr", 0)
}
}
DetectHiddenWindows,On
}
TextToGraphics_Gdip(pGraphics, Text, Options, Font:="Arial", Width:="", Height:="", Measure:=0, userBrush:=0, Unit:=0) {
Static Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
, Alignments := "Near|Left|Centre|Center|Far|Right"
OWidth := Width,IWidth := Width, IHeight:= Height
pattern_opts := (A_AhkVersion < "2") ? "iO)" : "i)"
RegExMatch(Options, pattern_opts "X([\-\d\.]+)(p*)", xpos)
RegExMatch(Options, pattern_opts "Y([\-\d\.]+)(p*)", ypos)
RegExMatch(Options, pattern_opts "W([\-\d\.]+)(p*)", PWidth)
RegExMatch(Options, pattern_opts "H([\-\d\.]+)(p*)", Height)
RegExMatch(Options, pattern_opts "C(?!(entre|enter))([a-f\d]+)", Colour)
RegExMatch(Options, pattern_opts "Top|Up|Bottom|Down|vCentre|vCenter", vPos)
RegExMatch(Options, pattern_opts "NoWrap", NoWrap)
RegExMatch(Options, pattern_opts "R(\d)", Rendering)
RegExMatch(Options, pattern_opts "S(\d+)(p*)", Size)
Width := PWidth
DllCall("gdiplus\GdipCloneBrush", "UPtr", Colour[2], "UPtr*", pBrushClone)
if Colour && !DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrushClone){
Static Integer := "Integer"
if Colour[2] is Integer
PassBrush := 1,pBrush := Colour[2]
}
if !(IWidth && IHeight) && ((xpos && xpos[2]) || (ypos && ypos[2]) || (Width && Width[2]) || (Height && Height[2]) || (Size && Size[2]))
return -1
Style := 0
For eachStyle, valStyle in StrSplit(Styles, "|")
{
if RegExMatch(Options, "\b" valStyle)
Style |= (valStyle != "StrikeOut") ? (A_Index-1) : 8
}
Align := 0
For eachAlignment, valAlignment in StrSplit(Alignments, "|")
{
if RegExMatch(Options, "\b" valAlignment)
Align |= A_Index//2.1 ; 0|0|1|1|2|2
}
xpos := (xpos && (xpos[1] != "")) ? xpos[2] ? IWidth*(xpos[1]/100) : xpos[1] : 0
ypos := (ypos && (ypos[1] != "")) ? ypos[2] ? IHeight*(ypos[1]/100) : ypos[1] : 0
Width := (Width && Width[1]) ? Width[2] ? IWidth*(Width[1]/100) : Width[1] : IWidth
Height := (Height && Height[1]) ? Height[2] ? IHeight*(Height[1]/100) : Height[1] : IHeight
If !PassBrush
Colour := "0x" (Colour && Colour[2] ? Colour[2] : "ff000000")
Rendering := (Rendering && (Rendering[1] >= 0) && (Rendering[1] <= 5)) ? Rendering[1] : 4
Size := (Size && (Size[1] > 0)) ? Size[2] ? IHeight*(Size[1]/100) : Size[1] : 12
If RegExMatch(Font, "^(.\:\\.)")
{
DllCall("gdiplus\GdipNewPrivateFontCollection", "ptr*", hFontCollection)
hFontFamily := 0
E := DllCall("gdiplus\GdipPrivateAddFontFile", "ptr", hFontCollection, "str", Font)
if !E {
VarSetCapacity(pFontFamily, 10, 0)
DllCall("gdiplus\GdipGetFontCollectionFamilyList", "ptr", hFontCollection, "int", 1, "ptr", &pFontFamily, "int*", found)
VarSetCapacity(FontName, 100)
DllCall("gdiplus\GdipGetFamilyName", "ptr", NumGet(pFontFamily, 0, "ptr"), "str", FontName, "ushort", 1033)
}
} Else DllCall("gdiplus\GdipCreateFontFamilyFromName", "WStr", Font, "uint", 0, "UPtr*", hFontFamily)
If !hFontFamily
DllCall("gdiplus\GdipGetGenericFontFamilySansSerif", "UPtr*", hFontFamily)
DllCall("gdiplus\GdipCreateFont", "UPtr", hFontFamily, "float", Size, "int", Style, "int", Unit, "UPtr*", hFont)
DllCall("gdiplus\GdipCreateStringFormat", "int", NoWrap ? 0x4000 | 0x1000 : 0x4000, "int", 0, "UPtr*", hStringFormat)
If !hStringFormat
DllCall("gdiplus\GdipStringFormatGetGenericTypographic", "UPtr*", hStringFormat)
if !PassBrush
DllCall("gdiplus\GdipCreateSolidFill", "UInt", Colour, "UPtr*", pBrush)
if !(hFontFamily && hFont && hStringFormat && pBrush && pGraphics)
{
E := !pGraphics ? -2 : !hFontFamily ? -3 : !hFont ? -4 : !hStringFormat ? -5 : !pBrush ? -6 : 0
If pBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
If hStringFormat
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
If hFont
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
If hFontFamily
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return E
}
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
DllCall("gdiplus\GdipSetStringFormatAlign", "UPtr", hStringFormat, "int", Align)
If InStr(Options, "autotrim")
DllCall("gdiplus\GdipSetStringFormatTrimming", "UPtr", hStringFormat, "int", 3)
DllCall("gdiplus\GdipSetTextRenderingHint", "UPtr", pGraphics, "int", Rendering)
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
ReturnRCtest := StrSplit(ReturnRC, "|")
testX := Floor(ReturnRCtest[1]) - 2
If (testX>xpos && NoWrap && (PWidth>2 || OWidth>2))
{
nxpos := Floor(xpos - (testX - xpos))
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(Height, RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
If vPos
{
ReturnRC := StrSplit(ReturnRC, "|")
if (vPos[0] = "vCentre") || (vPos[0] = "vCenter")
ypos += (Height-ReturnRC[4])//2
else if (vPos[0] = "Top") || (vPos[0] = "Up")
ypos += 0
else if (vPos[0] = "Bottom") || (vPos[0] = "Down")
ypos += Height-ReturnRC[4]
VarSetCapacity(RC, 16)
NumPut(xpos, RC, 0, "float"), NumPut(ypos, RC, 4, "float")
NumPut(Width, RC, 8, "float"), NumPut(ReturnRC[4], RC, 12, "float")
VarSetCapacity(TempRC, 16)
DllCall("gdiplus\GdipMeasureString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", &TempRC, "uint*", 0, "uint*", 0)
ReturnRC := &TempRC ? NumGet(TempRC, 0, "float") "|" NumGet(TempRC, 4, "float") "|" NumGet(TempRC, 8, "float") "|" NumGet(TempRC, 12, "float") "|" 0 "|" 0 : 0
}
thisBrush := userBrush ? userBrush : pBrush
if !Measure
_E := DllCall("gdiplus\GdipDrawString", "UPtr", pGraphics, "WStr", Text, "int", -1
, "UPtr", hFont, "UPtr", &RC, "UPtr", hStringFormat, "UPtr", thisBrush)
if !PassBrush
DllCall("gdiplus\GdipDeleteBrush", "UPtr", pBrush)
DllCall("gdiplus\GdipDeleteStringFormat", "UPtr", hStringFormat)
DllCall("gdiplus\GdipDeleteFont", "UPtr", hFont)
DllCall("gdiplus\GdipDeleteFontFamily", "UPtr", hFontFamily)
If hFontCollection
DllCall("gdiplus\GdipDeletePrivateFontCollection", "ptr*", hFontCollection)
return _E ? _E : ReturnRC
}
Exit:
DllCall("gdiplus\GdiplusShutdown", "UPtr", CTToken)
if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "UPtr")
DllCall("FreeLibrary", "UPtr", hModule)
ExitApp
Return
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)