autohotkey可通过windows api实现窗口半透明与点击穿透:先设ws_ex_layered样式,再用setlayeredwindowattributes设alpha值;启用穿透需追加ws_ex_transparent标志;支持一键切换、批量处理及独立控制透明/穿透状态。

如果您希望使用AutoHotkey控制指定窗口的透明度或启用点击穿透功能,则需调用Windows API中的SetLayeredWindowAttributes和WS_EX_TRANSPARENT等机制。以下是实现窗口半透明与点击穿透的具体操作步骤:
一、设置目标窗口为半透明
该方法通过修改窗口扩展样式并调用SetLayeredWindowAttributes函数,使窗口整体呈现指定Alpha值(0–255)的透明效果。窗口必须具备WS_EX_LAYERED扩展样式才能生效。
1、运行AutoHotkey脚本,使用WinGet命令获取目标窗口的HWND句柄。
2、调用DllCall("SetWindowLong", "Ptr", hWnd, "Int", -20, "UInt", 0x80000 | DllCall("GetWindowLong", "Ptr", hWnd, "Int", -20, "UInt"))启用WS_EX_LAYERED样式。
3、执行DllCall("SetLayeredWindowAttributes", "Ptr", hWnd, "UInt", 0, "UChar", 150, "UInt", 2),其中150为透明度值(数值越小越透明,0为完全透明,255为不透明)。
二、启用窗口点击穿透(鼠标穿透)
点击穿透指鼠标事件直接穿透当前窗口,作用于其下方的窗口或桌面。需将WS_EX_TRANSPARENT扩展样式添加至窗口,并确保窗口已设为分层窗口(WS_EX_LAYERED)。
1、确认目标窗口句柄hWnd已获取且已启用WS_EX_LAYERED样式。
2、调用DllCall("SetWindowLong", "Ptr", hWnd, "Int", -20, "UInt", DllCall("GetWindowLong", "Ptr", hWnd, "Int", -20) | 0x20),追加WS_EX_TRANSPARENT标志(0x20)。
3、再次调用SetLayeredWindowAttributes以刷新分层属性,确保穿透生效。
三、一键切换透明/不透明状态
该方案通过热键触发,动态读取当前窗口透明度并反向切换,避免硬编码固定值,提升脚本实用性与交互性。
1、使用WinGet, TransColor, ID, A 获取活动窗口当前透明色设置(若未设置则返回空)。
2、通过WinGet, ExStyle, ID, A 提取窗口当前扩展样式,判断是否含0x20(WS_EX_TRANSPARENT)与0x80000(WS_EX_LAYERED)。
3、若当前为不透明状态,则执行半透明+穿透设置;若已透明,则调用SetLayeredWindowAttributes传入Alpha=255并移除WS_EX_TRANSPARENT样式。
四、按窗口类名或标题批量处理多个窗口
适用于需同时对多个同类窗口(如所有Notepad窗口)应用透明与穿透效果的场景,利用WinExist循环匹配并逐个注入样式。
1、使用Loop, % WinExist("ahk_class Notepad") 或 WinExist("ahk_exe chrome.exe") 枚举符合条件的窗口句柄。
2、对每个匹配到的hWnd,依次执行启用WS_EX_LAYERED、设置Alpha=128、添加WS_EX_TRANSPARENT的操作。
3、在循环末尾加入Sleep, 50 防止API调用过快导致部分窗口未响应。
五、禁用穿透但保留透明度的独立控制
当仅需视觉透明而不影响鼠标操作时,可单独移除WS_EX_TRANSPARENT但维持WS_EX_LAYERED与Alpha值,实现“可见但可点击”的效果。
1、获取目标窗口hWnd后,调用ExStyle := DllCall("GetWindowLong", "Ptr", hWnd, "Int", -20)读取当前扩展样式。
2、执行NewStyle := ExStyle & ~0x20 清除WS_EX_TRANSPARENT位,保留其余样式位。
3、调用DllCall("SetWindowLong", "Ptr", hWnd, "Int", -20, "UInt", NewStyle)写回新样式,并重新调用SetLayeredWindowAttributes保持原有Alpha值。











