• 对run命令后面的变量,不建议用表达式,而建议用%变量,如hosts命令用表达式反而不起作用
  • gui命令获得的尺寸为真实尺寸,而win命令获得的尺寸均为A_screenDPI/96的倍数后的,尤其是winset,region这样的w和h一定要记得进行dpi缩放,否则窗口尺寸显示会小。
  • gui, font 命令在其他线程中会对后面的gui一些控件(特别是销毁后再生成)的外观会有影响
  • 通过FrameShadow(GUIID)来实现窗体阴影的尺寸,似乎比A_GUIWIDTH要大一点点,哪怕是无边框无标题栏的情况
  • scite4对某些脚本中存在emoji字符的时候,不采用% "★" 而是直接采用 ★ 这样的会出现卡死的情况。
  • gui的+owner是指该窗口隶属于 owner后面的ID变量窗口,如 +owner%mainguiid%,当mainguiid窗口关闭时,这个gui也会自动被关闭。如果需要顶层,那么可以在该gui之前将owner窗口disable,到该gui窗口销毁的时候在enable这个owner窗口。而+parent 则将该gui嵌入到 parent后面的id变量窗口中,如嵌入到桌面,任务栏等等。
  • sendinput {Enter} 这样的发送方式更可靠有效
  • 一个有效的判断窗体移除窗体的代码

    ;**************************************************
    ;另一种窗口拖动的方案 
    ;**************************************************
    WM_LBUTTONDOWN(wParam, lParam, msg, hwnd) {
    static init := OnMessage(0x0201, "WM_LBUTTONDOWN")
    PostMessage, 0xA1, 2,,, A
    }
    
    ;**************************************************
    ;另一种窗口拖动的方案 ,成功实现鼠标离开窗口的操作,应该是通过loop操作的时间与移动速度的时间打了一个时间差
    ;**************************************************
    WM_MOUSEMOVE(wParam, lParam, msg, hwnd) {
    static init := OnMessage(0x0200, "WM_MOUSEMOVE")
    MouseGetPos,,,cwid
    winset, transcolor, OFF, ahk_id %testid%
        loop
        {
            MouseGetPos,,,cwid
            if !(cwid=testid)
            {
                    winset, transcolor, EAEAEA 255, ahk_id %testid%
                    BREAK
            }
        }
    }
  • 暗黑主题(win10~11窗体),这条命令结合frameshadow可以避免frameshadow在guimove的时候闪动。

    darkme(hWnd)
    {
    if 1
    DWMWA_USE_IMMERSIVE_DARK_MODE := 19  ;23h2是这个数字。貌似在10.0.17763以后都是
    else
    DWMWA_USE_IMMERSIVE_DARK_MODE := 20
    
    DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", hWnd, "Int", DWMWA_USE_IMMERSIVE_DARK_MODE, "Int*", true, "Int", 4)
    ;~ uxtheme := DllCall("GetModuleHandle", "Str", "uxtheme", "Ptr")
    ;~ DllCall(DllCall("GetProcAddress", "Ptr", uxtheme, "Ptr", 135, "Ptr"), "Int", 2)
    ;~ DllCall(DllCall("GetProcAddress", "Ptr", uxtheme, "Ptr", 136, "Ptr"))
    }
  • 彩色按钮button,详情参阅:https://github.com/AHK-just-me

    gui, abt: add, button, xP  y+15 w60  gbuyacoffee h25 vcfe1 hwndbtncoffee, % "buy"
    
    Opt1 := [0, 0xFF1296DB, , "White", 5, , ,2]  ; "Red"        ; normal flat background & text color;常规背景+字体颜色,5为圆角
    Opt2 := [ , 0xFFFC0000]                                          ; hot flat background color 移到上面背景颜色
    Opt5 := [ , , ,"WHITE"]                                      ; defaulted text color -> animation 默认字体颜色
    If !ImageButton.Create(btncoffee, Opt1, Opt2, , , Opt5)
    MsgBox, 0, ImageButton Error btnclose, % ImageButton.LastError
  • 新建ahk自动添加内容:

    • 修改ahk目录下的template.ahk文件
    • 注册表 [HKEY_CLASSES_ROOT.ahk\ShellNew] 右侧的FileName输入该 template的全路径名称即可。
  • 关于关键词颜色高亮不全的解决办法

    • 检查 ahk.properties 中的下面段落

      # Keywords
      import ahk.keywords  ;比如这个文件就因为没有包含,或者不存在ahk1.keyword.properties文件。
      import ahk1.keywords
      import ahk2.keywords
      import ahk.keys
  • 如何将 ah2 关联为v2版本
    主要是通过ahk.properties中的 ahk.file.extension=`*.ah2 设置为你要的后缀,这样用scite4打开ah2的文件就会自动进行高亮等。这样可以分别设置v1和v2版本了。
  • GUI的细边框 +border 如果在无标题 -caption 模式下,必须要放在 -caption后面,否则不起作用
  • win11窗体外框效果

    ;**************************************************
    ;【函数】无边框窗口显示阴影
    ;**************************************************
    FrameShadow(HGui, _ISENABLED:="1") {
      DllCall("dwmapi\DwmIsCompositionEnabled","IntP",_ISENABLED) ; Get if DWM Manager is Enabled
      if !_ISENABLED ; if DWM is not enabled, Make Basic Shadow
          DllCall("SetClassLong","UInt",HGui,"Int",-26,"Int",DllCall("GetClassLong","UInt",HGui,"Int",-26)|0x20000)
      else {
          VarSetCapacity(_MARGINS,16)
          NumPut(1,&_MARGINS,0,"UInt")
          NumPut(1,&_MARGINS,4,"UInt")
          NumPut(1,&_MARGINS,8,"UInt")
          NumPut(1,&_MARGINS,12,"UInt")
          DllCall("dwmapi\DwmSetWindowAttribute", "Ptr", HGui, "UInt", 2, "Int*", 2, "UInt", 4)
          DllCall("dwmapi\DwmExtendFrameIntoClientArea", "Ptr", HGui, "Ptr", &_MARGINS)
      }
    }
  • 数组变量在if中似乎对大小写有区别,名称最好全部对上,如 Array._MaxIndex() 这样的。遇到一次全小写结果总是无法读取的情况。
  • api动画,动画参数详见:aminatewindow动画参数
    动画设置几个注意地方:
    1)gui,show, hide x y w h 这样的设置建议全部确定好,并且处于hide状态,然后就直接设置dllcall动画语句,然后就是再gui,show这样,最后的一句show不要再调整窗口的位置及大小,否则动画失效。
    2)对于采用frameshow的外框效果的gui,在动画dllcall后面紧跟frameshadow处理,不要把frameshadow放在dllcall之前,否则会影响动画时会有一个一个浅色外框(gui外框尺寸大小)

    DllCall("AnimateWindow", "Ptr", topmainGUIid, "UINT", 500, "UINT", "0x00000004") ;动画函数
    DllCall("ShowWindow", "Ptr", topmainGUIid, "INT", "8") ;显示窗口
    DllCall("ShowWindow", "Ptr", topmainGUIid, "INT", "0") ;隐藏窗口
  • 读取RC资源中的png文件举例:
ret := getpicture(hPicCtrl, "logo1.PNG") ;使用方法,hPicCtrl为pic控件的hwnd,LOGO1.PNG为文件RCDATA中的PNG名称
GETPicture(hwnd,RCPng){
hRSrc := DllCall("FindResource", "ptr", 0, "str", RCPng, "ptr", 10, "ptr")
sData := DllCall("SizeofResource", "ptr", 0, "ptr", hRSrc, "uint")
hRes  := DllCall("LoadResource", "ptr", 0, "ptr", hRSrc, "ptr")
pData := DllCall("LockResource", "ptr", hRes, "ptr")
hGlob := DllCall("GlobalAlloc", "uint", 2, "uint", sData, "ptr")
pGlob := DllCall("GlobalLock", "ptr", hGlob, "ptr")
DllCall("msvcrt\memcpy", "ptr", pGlob, "ptr", pData, "uint", sData, "CDecl")
DllCall("GlobalUnlock", "ptr", hGlob)
DllCall("ole32\CreateStreamOnHGlobal", "ptr", hGlob, "int", 1, "ptr*", pStream)
hGdip := DllCall("LoadLibrary", "str", "gdiplus", "Ptr")
VarSetCapacity(si, 16, 0), NumPut(1, si, "UChar")
DllCall("gdiplus\GdiplusStartup", "ptr*", gdipToken, "ptr", &si, "ptr", 0)
DllCall("gdiplus\GdipCreateBitmapFromStream", "ptr", pStream, "ptr*", pBitmap)
DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "ptr", pBitmap, "ptr*", hBitmap, "uint", 0)
SendMessage, 0x172, 0, hBitmap,, ahk_id %hwnd%
;~ GuiControl, Move, %hwnd%, w240 h78
DllCall("gdiplus\GdipDisposeImage", "ptr", pBitmap)
DllCall("gdiplus\GdiplusShutdown", "ptr", gdipToken)
DllCall("FreeLibrary", "ptr", hGdip)
ObjRelease(pStream)
return
}