必须使用dllcall调用windows底层api,需准确声明dll路径、函数名、参数类型、调用约定及返回值;支持无参函数、字符串(utf-16)、结构体内存构造与错误码捕获。

如果您希望在AutoHotkey脚本中直接调用Windows系统底层API函数,而非依赖内置命令或第三方库,则必须使用DllCall。该函数允许脚本以原生方式调用动态链接库(DLL)中的导出函数,前提是正确声明参数类型、调用约定与返回值。以下是具体操作步骤:
一、确认API函数所在DLL及函数签名
调用前需明确目标函数的完整名称、所在系统DLL(如kernel32.dll、user32.dll)、调用约定(通常为__stdcall)、参数数量与精确类型(如UInt、Ptr、Int64、Str等),以及返回值类型。错误的类型声明将导致内存访问违规或返回垃圾值。
1、查阅Microsoft官方文档(如docs.microsoft.com)获取函数原型,例如GetTickCount64声明为:ULONGLONG GetTickCount64(void);位于kernel32.dll。
2、确认该函数在目标Windows版本中可用——GetTickCount64仅支持Windows Vista及以上系统。
3、记录其调用约定:Windows API多数采用Cdecl或StdCall;AutoHotkey默认为StdCall,若函数为Cdecl需显式指定。
二、编写基础DllCall语句并验证返回值
使用DllCall语法构造调用,传入DLL名、函数名、参数类型列表及对应参数值,并接收返回值。必须严格匹配参数个数与类型顺序,否则引发崩溃。
1、调用无参函数GetTickCount64:
tick := DllCall("kernel32\GetTickCount64", "UInt64")
2、将返回值赋给变量后,用MsgBox验证:
MsgBox, % "系统启动已过 " tick " 毫秒"
3、若函数返回指针或需要输出参数,须使用Ptr*或Int*等可写引用类型,并在调用后读取变量值。
三、处理字符串参数与宽字符支持
Windows API中多数字符串函数(如MessageBoxW、lstrlenW)要求UTF-16(宽字符)输入。AutoHotkey v2默认使用UTF-16,但v1需确保启用Unicode版并使用Str类型配合W后缀函数名。
1、调用宽字符MessageBoxW需提供标题与内容的UTF-16缓冲区:
result := DllCall("user32\MessageBoxW", "Ptr", 0, "Str", "Hello", "Str", "AHK DllCall", "UInt", 0)
将提醒同步至 Windows/Outlook 日历。用户提及「提醒我」「设置提醒」「加到日历」「同步到日历」「日程」「calendar」「日历」时触发。支持Microsoft Graph API 设备代码流认证,无需 Web 服务器,直接写入用户 Outlook 日历。
2、若原始字符串含中文或特殊符号,必须确保脚本文件保存为UTF-8 with BOM或UTF-16 LE编码。
3、对需输出字符串的API(如GetWindowTextW),先分配足够长度的VarSetCapacity缓冲区,再以Str类型传入地址。
四、传递结构体(Struct)参数
当API函数接收结构体(如RECT、POINT、STARTUPINFO)时,不能直接传结构名,而需手动构造内存块,按字段顺序写入各成员值,并传入该内存地址。
1、使用VarSetCapacity分配足够字节的缓冲区,例如RECT结构共16字节:
VarSetCapacity(rect, 16, 0)
2、用NumPut依次写入left、top、right、bottom字段(均为Int):
NumPut(100, rect, 0, "Int"), NumPut(100, rect, 4, "Int"), NumPut(300, rect, 8, "Int"), NumPut(200, rect, 12, "Int")
3、将rect变量名(即首地址)作为Ptr类型传入DllCall:
DllCall("user32\SetWindowPos", "Ptr", hWnd, "Ptr", 0, "Int", 0, "Int", 0, "Ptr", &rect, "UInt", 0)
五、错误检查与LastError捕获
DllCall本身不抛出异常,失败时可能返回0、-1或NULL,具体取决于API定义。必须依据文档判断何为错误返回值,并主动调用GetLastError获取详细错误码。
1、在DllCall后立即调用GetLastError(需先声明):
LastError := DllCall("kernel32\GetLastError", "UInt")
2、根据返回值查MSDN错误代码表,例如5表示ACCESS_DENIED,122表示ERROR_INSUFFICIENT_BUFFER。
3、对关键调用添加条件判断:
if (result = 0) { MsgBox, 调用失败,错误码:%LastError% }
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










