原贴速达
/*
调整MsgBox字体大小显示更清楚
*/
Global FontObject:={}
if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
if (FontName&&FontSize&&FontWeight&&Font_IsItalic<>""){
FontObject["FontName"]:=FontName,FontObject["FontSize"]:=FontSize,FontObject["FontWeight"]:=FontWeight,FontObject["Font_IsItalic"]:=Font_IsItalic
MsgBox,4096,,% "#####更改前#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
if SetMsgBoxFontInfo("宋体", 16, 700, True){
if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
MsgBox,4096,,% "#####更改后#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
if SetMsgBoxFontInfo(FontObject.FontName,FontObject.FontSize,FontObject.FontWeight,FontObject.Font_IsItalic){
if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
MsgBox,4096,,% "#####还原后#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
}
}
}
}
}
}
;;获取msgbox框字体信息https://www.autohotkey.com/boards/viewtopic.php?t=9122
GetMsgBoxFontInfo(ByRef Name:="", ByRef Size:=0, ByRef Weight:=0, ByRef IsItalic:=0) {
; SystemParametersInfo常量,用于检索与非最小化窗口的非客户端区域关联的度量
static SPI_GETNONCLIENTMETRICS := 0x0029
static NCM_Size := 40 + 5*(A_IsUnicode ? 92 : 60) ; 非ClientMetrics结构的大小(不包括iPadedDBOrderWidth)
static MsgFont_Offset := 40 + 4*(A_IsUnicode ? 92 : 60) ; 非ClientMetrics结构中lfMessageFont的偏移量
static Size_Offset := 0 ; 非ClientMetrics结构中cbSize的偏移量
static Height_Offset := 0 ;LOGFONT结构中lfHeight的偏移量
static Weight_Offset := 16 ; LOGFONT结构中lfWeight的偏移量
static Italic_Offset := 20 ; LOGFONT结构中lfItalic的偏移量
static FaceName_Offset := 28 ; LOGFONT结构中lfFaceName的偏移量
static FACESIZE := 32 ; LOGFONT结构中lfFaceName数组的大小
; 字体名称字符串中的最大字符数
VarSetCapacity(NCM, NCM_Size, 0) ; 设置NCM结构的大小并初始化
NumPut(NCM_Size, &NCM, Size_Offset, "UInt") ; 设置NCM结构的cbSize元素
; 获取系统参数并将其存储在非客户机度量结构(NCM)中
if !DllCall("SystemParametersInfo" ; 如果SystemParametersInfo函数返回空值
, "UInt", SPI_GETNONCLIENTMETRICS
, "UInt", NCM_Size
, "Ptr", &NCM
, "UInt", 0)
Return false
Name := StrGet(&NCM + MsgFont_Offset + FaceName_Offset, FACESIZE) ; Get the font name
Height := NumGet(&NCM + MsgFont_Offset + Height_Offset, "Int") ; Get the font height
Size := DllCall("MulDiv", "Int", -Height, "Int", 72, "Int", A_ScreenDPI) ; 将字体高度转换为字体大小(以点为单位)
; Reference: http://stackoverflow.com/questions/2944149/converting-logfont-height-to-font-size-in-points
Weight := NumGet(&NCM + MsgFont_Offset + Weight_Offset, "Int") ; 获取字体Weight(400为正常,700为粗体)
IsItalic := NumGet(&NCM + MsgFont_Offset + Italic_Offset, "UChar") ; 获取字体的斜体状态
Return true
}
;;设置msgbox框字体信息;;https://www.autohotkey.com/boards/viewtopic.php?t=9122
SetMsgBoxFontInfo(Name:="", Size:=0, Weight:=0, IsItalic:=-1) {
; SystemParametersInfo常量,用于检索和设置与非最小化窗口的非客户端区域关联的度量
static SPI_GETNONCLIENTMETRICS := 0x0029
static SPI_SETNONCLIENTMETRICS := 0x002A
static SPIF_UPDATEINIFILE := 0x01
static SPIF_SENDCHANGE := 0x02
static NCM_Size := 40 + 5*(A_IsUnicode ? 92 : 60) ; 非ClientMetrics结构的大小(不包括iPadedDBOrderWidth)
static MsgFont_Offset := 40 + 4*(A_IsUnicode ? 92 : 60) ; 非ClientMetrics结构中lfMessageFont的偏移量
static Size_Offset := 0 ; 非ClientMetrics结构中cbSize的偏移量
static Height_Offset := 0 ; LOGFONT结构中lfHeight的偏移量
static Weight_Offset := 16 ; LOGFONT结构中lfWeight的偏移量
static Italic_Offset := 20 ; LOGFONT结构中lfItalic的偏移量
static FaceName_Offset := 28 ; LOGFONT结构中lfFaceName的偏移量
static FACESIZE := 32 ; LOGFONT结构中lfFaceName数组的大小
; 字体名称字符串中的最大字符数
VarSetCapacity(NCM, NCM_Size, 0) ; 设置NCM结构的大小并初始化它
NumPut(NCM_Size, &NCM, Size_Offset, "UInt") ; 设置NCM结构的cbSize元素
; 获取系统参数并将其存储在非客户机度量结构(NCM)中
if !DllCall("SystemParametersInfo" ; 如果SystemParametersInfo函数返回空值。。。
, "UInt", SPI_GETNONCLIENTMETRICS
, "UInt", NCM_Size
, "Ptr", &NCM
, "UInt", 0)
Return false
if Name
StrPut(Name, &NCM + MsgFont_Offset + FaceName_Offset, FACESIZE)
if Size {
Height := -DllCall("MulDiv", "Int", Size, "Int", A_ScreenDPI, "Int", 72)
; Reference: http://stackoverflow.com/questions/2944149/converting-logfont-height-to-font-size-in-points
NumPut(Height, &NCM + MsgFont_Offset + Height_Offset, "Int")
}
if Weight
NumPut(Weight, &NCM + MsgFont_Offset + Weight_Offset, "Int")
if (IsItalic = 1 || IsItalic = 0)
NumPut(IsItalic, &NCM + MsgFont_Offset + Italic_Offset, "UChar")
; 在非客户端度量结构(NCM)中设置系统参数
if !DllCall("SystemParametersInfo" ; 如果SystemParametersInfo函数返回空值。。。
, "UInt", SPI_SETNONCLIENTMETRICS
, "UInt", NCM_Size
, "Ptr", &NCM
, "UInt", SPIF_UPDATEINIFILE | SPIF_SENDCHANGE) ; Update the user profile
Return false
Return true
}
GetDefaultFontName(){
NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
return StrGet(&info + 52)
}
GuiDefaultFont() ; by SKAN (modified by jNizM)
{
hFont := DllCall("gdi32.dll\GetStockObject", "Int", 17, "Ptr")
VarSetCapacity(LF, szLF := 60 * (A_IsUnicode ? 2 : 1))
DllCall("gdi32.dll\GetObject", "Ptr", hFont, "Int", szLF, "Ptr", &LF)
hDC := DllCall("user32.dll\GetDC", "Ptr", hwnd), DPI := DllCall("gdi32.dll\GetDeviceCaps", "Ptr", hDC, "Int", 90)
DllCall("user32.dll\ReleaseDC", "Ptr", 0, "Ptr", hDC), S := Round((-NumGet(LF, 0, "Int") * 72) / DPI)
Fnt := {}, Fnt.Name := DllCall("kernel32.dll\MulDiv", "Int", &LF+28, "Int", 1, "Int", 1, "Str"), Fnt.Size := S
return Fnt
}
老表作品必属精品
搬运工而已,我只是更加形象化加了示例
执行的时候,一定要把3个 Msgbox 都执行完后,再退出脚本。因为最后一个会还原默认的字体。 中途停止的话,原来默认的字体信息就丢失了! 系统被设置为别的字体了。
还原win10 默认字体
SetMsgBoxFontInfo(“Microsoft Yahei Ul”, 10, 400, False)
ExitApp