将窗体嵌入任务栏的操作其实看懂了代码就比较简单,就是利用dllcall内置函数将当前的gui窗体变成任务栏(tray_hwnd)的一个子窗口。

具体代码如下:

 WinGet, TaskbarId, ID , ahk_class Shell_TrayWnd
 Gui ,  +LastFound +ToolWindow +AlwaysOnTop -Border -caption -DPIScale
 Gui, margin,0,0
 Gui, add, text, x0 y0 w180,h25 
 Gui, 10:Show, center W200  H30,  % "测试窗体名称"
 GuiId := WinExist() ; LastFound
  DllCall("SetParent", "uint", GuiId, "uint", TaskbarId)

这里面有一个地方需要注意,如果嵌入了任务栏,因为属于任务栏的子窗体,那么对该窗体上的控件操作可以采用:

 WinActivate,   ahk_class Shell_TrayWnd
 ControlFocus, edit1, ahk_class Shell_TrayWnd

如果继续采用常规的gui的title来操作,可能会出现无效的情况。

?

关于任务栏一些数据的获取;

WinGet, TaskbarId, ID , ahk_class Shell_TrayWnd  ;获取任务栏的id
wingetpos, xpos, ypos, wt, ht, ahk_class Shell_TrayWnd ;获取任务栏的坐标,宽高,计算数值一般是从屏幕左上角开始计算。
            ;大图标任务栏高度一般是50,小图标任务栏高度是38
ControlGetPos, xpos1, ypos1, wt1, ht1, button2, ahk_class Shell_TrayWnd ;获取任务栏三角箭头的收纳按钮的坐标,宽高
            ;该坐标是以任务栏的窗体为参照,而不是整个屏幕为参照的。

?

另外关于gui的一些设置地方做个备忘:

1) winset, transcolor, guibackgroundcolor N ;该命令是设置指定颜色为透明色的,N为透明值,1-255,255为不透明;如果设为不透明,则建议采用off参数,提高性能;

2)winset ,region, x-y? w h rx-x ;这个设置有几个地方需要注意:第一就是要限制gui的-dpiscale参数,禁止dpi缩放,否则这里面的width,height会收到dpi的比例影响,从而容易混乱;第二就是x-y的坐标跟R的半径值相等,且w+2x建议等于gui窗体的宽度,同理h+2r等于gui窗体的高度,这样的最终效果比较合适。x-用这个坐标按照道理应该是矩形的左上角坐标(没找到详细的说明资料),如果带R参数的话,一定需要x-y 坐标同时存在,否则没效果;(在官方的v2版本中,这个命令好像已经合并成了winsetregion一个命令)

3)WinSet, Transparent, N, WinTitle ;这个是直接设置窗体的透明度。