这还是终于找到了AHK实现的方法了,不过据说这个API不太完美,实现的效果有限,比不上UMP应用
不过我只要透明的话,内存占用特小,集合到我的AHK里面不是很好吗?
/*
win桌面美化,AHK桌面美化的小工具找得实在是困难,我一直想将那些小工具融合到自己可以调整的AHK中,,,可是资源少
任务栏背景透明
完全透明: accent_state := 2 并且 gradient_color := "0x01000000"
结合UMP应用RoudedTB,它成功将任务栏切割了,并可以单独隐藏右下角托盘区! 希望有人可以去RoudedTB里面看看能否用AHK实现?
UMP微软商店有一个TranslucentTB结合RoudedTB可以比较完美融合,但是我就是想少用一个软件,所以大概可以少用前者了
以下代码我是抄的AutoIt的,https://www.autoitscript.com/forum/topic/188664-function-setwindowcompositionattribute-convert-c-to-autoit/
反正能满足我的需求就可以了,毕竟中文论坛里面没有找到现成能用的
*/
#SingleInstance Force
#NoEnv
;accent_state := 2 ; 2代表透明,我用2,1
;gradient_color := "0x01000000" ; 0x01前面四个数字代表gradient梯度,它和透明2组合之后效果就是完全透明
;2, 0xa1e3c791) ; <- Set transparent with color 0xd7a78f ( rgb = 0x91c7e3 ) and alpha 0xa1
TaskBarSet() ;函数默认全透明了,我就不用传参数了
TaskBarSet(accent_state:=2,gradient_color:="0x01000000")
{
hTrayWnd := DllCall("User32\FindWindow", "str", "Shell_TrayWnd", "ptr", , "ptr")
pad := A_PtrSize=8 ? 4 : 0
WCA_ACCENT_POLICY := 19
accent_size := VarSetCapacity(ACCENT_POLICY, 16, 0)
NumPut((accent_state>0 && accent_state<4) ? accent_state : 0, ACCENT_POLICY, 0, "int")
NumPut(gradient_color, ACCENT_POLICY, 8, "int")
VarSetCapacity(WINCOMPATTRDATA, 4 + pad + A_PtrSize + 4 + pad, 0)
&& NumPut(WCA_ACCENT_POLICY, WINCOMPATTRDATA, 0, "int")
&& NumPut(&ACCENT_POLICY, WINCOMPATTRDATA, 4 + pad, "ptr")
&& NumPut(accent_size, WINCOMPATTRDATA, 4 + pad + A_PtrSize, "uint")
DllCall("user32\SetWindowCompositionAttribute", "ptr", hTrayWnd, "ptr", &WINCOMPATTRDATA)
;就是这么一个API
}
/* 这数据结构是这样的
typedef struct _WINDOWCOMPOSITIONATTRIBDATA {
WINDOWCOMPOSITIONATTRIB Attrib;
PVOID pvData;
SIZE_T cbData;
} WINDOWCOMPOSITIONATTRIBDATA;
typedef enum _WINDOWCOMPOSITIONATTRIB {
WCA_UNDEFINED = 0,
WCA_NCRENDERING_ENABLED = 1,
WCA_NCRENDERING_ENABLED = 1,
WCA_NCRENDERING_POLICY = 2,
WCA_TRANSITIONS_FORCEDISABLED = 3,
WCA_ALLOW_NCPAINT = 4,
WCA_CAPTION_BUTTON_BOUNDS = 5,
WCA_NONCLIENT_RTL_LAYOUT = 6,
WCA_FORCE_ICONIC_REPRESENTATION = 7,
WCA_EXTENDED_FRAME_BOUNDS = 8,
WCA_HAS_ICONIC_BITMAP = 9,
WCA_THEME_ATTRIBUTES = 10,
WCA_NCRENDERING_EXILED = 11,
WCA_NCADORNMENTINFO = 12,
WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
WCA_VIDEO_OVERLAY_ACTIVE = 14,
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
WCA_DISALLOW_PEEK = 16,
WCA_CLOAK = 17,
WCA_CLOAKED = 18,
WCA_ACCENT_POLICY = 19,
WCA_FREEZE_REPRESENTATION = 20,
WCA_EVER_UNCLOAKED = 21,
WCA_VISUAL_OWNER = 22,
WCA_LAST = 23
} WINDOWCOMPOSITIONATTRIB;
typedef struct _ACCENT_POLICY {
ACCENT_STATE AccentState;
DWORD AccentFlags;
DWORD GradientColor;
DWORD AnimationId;
} ACCENT_POLICY;
typedef enum _ACCENT_STATE {
ACCENT_DISABLED = 0,
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_INVALID_STATE = 4
} ACCENT_STATE;
_ACCENT_FLAGS {
DrawLeftBorder = 0x20,
DrawTopBorder = 0x40,
DrawRightBorder = 0x80,
DrawBottomBorder = 0x100,
DrawAllBorders = (DrawLeftBorder | DrawTopBorder | DrawRightBorder | DrawBottomBorder)
}
*/
不过这代码有个缺陷就是你一旦单击了任务的开始按钮之后,效果立马消失了!!!我也是无语
/*
Since clicking on Win-Start will reset the taskbar, it will be the best solution to use a SetTimer with x ms to set the Attribute
#NoEnv
#Persistent
#SingleInstance Force
SetBatchLines -1
SetTimer, UPDATE_TASKBAR, 100
return
UPDATE_TASKBAR:
TaskBar_SetAttr(3)
return
*/
所以,建议就是保持后台运行,并且设置定时刷新,不过好在AHK内存少,不过还是不完美啊!
所以开头就改一下,....
#SingleInstance Force
#NoEnv
#Persistent
#NoTrayIcon
SetBatchLines -1
SetTimer, UPDATE_TASKBAR, 100
return
UPDATE_TASKBAR:
TaskBarSet()
return
求有没有完美的AHK解决方案呀?!
目前已经集成到我的AHK里面,虽然不太完美,但是内存超级小,可以了
查看translucentTB代码及设置,发现它实现原理是一致的,它也会面对点击开始栏的问题,看看它的配置文件:
; Advanced settings
; sleep time in milliseconds, a shorter time reduces flicker when opening start, but results in higher CPU usage.
sleep-time=10
它的刷新时间非常短,所以带给的视觉上效果几乎没有,AHK的SETtmer一样设置短一点也可以一样效果.
不错不错,用上了、
写一个检测开始窗口打开/关闭的函数,如果开始窗口有过打开/关闭,就运行一次这个函数
对于最新版的任务栏win11_23H2 这个代码就失效了!!!
为啥?我现在发现我的submenu没法用了,不知道咋回事,看代码和一起一样的。现在一点就要提示缺少lebel,无语了