为 dll 或 exe 函数创建脚本函数。
#DllImport Function_Name, DllFile\Function , Type1, Arg1, Type2, Arg2, Cdecl ReturnType示例: #DllImport ExecScript, %A_AhkPath%\ahkExec,Str,,CDecl
新函数的名称。参见示例。
DLL 或 EXE 文件名,后跟反斜杠和函数名称。例如: “MyDLL\MyFunction” (省略时文件扩展名“.dll”为默认值)。如果没有指定绝对路径, DllFile 假定位于系统的 PATH 或 A_WorkingDir 中。也可以使用以下内置变量:A_ScriptDir、A_AhkPath、A_DllPath、A_AppData、A_AppDataCommon。
DllFile 当调用驻留在 User32.dll、Kernel32.dll、ComCtl32.dll 或 Gdi32.dll 中的函数时,可以省略。例如, “User32\IsWindowVisible” 与 “IsWindowVisible” 产生相同的结果。
如果通过给定名称找不到函数,则会自动附加“W”(Unicode) 后缀。例如, "MessageBox" 是一样的 "MessageBoxW".
该参数也可以仅包含一个整数,它被解释为要调用的函数的地址。此类地址的来源包括 COM 和 RegisterCallback。
注意: 不支持 9MyFunction 或 0MyDll.dll\Function,因为它们会被视为整数并导致抛出异常。
该参数也可以是表示代码的十六进制字符串。
64 位的十六进制代码可以附加在使用冒号 (:) 分隔的 32 位代码之后 [32 位十六进制]:[64 位十六进制]。另请参见下面的示例。
这些对中的每一对都代表要传递给函数的单个参数。对的数量是无限的。对于 Type,请参阅 DllCall 类型表。可以不带引号指定类型。
对于 Arg,请指定要传递给函数的默认值。仅当函数调用省略对应参数时,才会使用此参数。如果 Arg 是字符串,则不得用引号 ("") 括起来;所有以数字开头的参数都会转换为数字,也支持十六进制值。
这个词 Cdecl 通常会被省略,因为大多数函数使用标准调用约定而不是“C”调用约定(接受不同数量参数的函数,例如 wsprintf 是一个例外)。请注意,大多数面向对象的 C++ 函数都使用 thiscall 约定,不受支持。
如果存在,则该词 Cdecl 应在返回类型(如果有)之前列出。用空格或制表符将每个单词与下一个单词分开。例如: “Cdecl Str”.
由于 64 位代码中不存在单独的“C”调用约定, Cdecl 可以指定,但对 AutoHotkey 的 64 位版本没有影响。
ReturnType:如果函数返回 32 位有符号整数 (Int)、BOOL 或什么也不返回, ReturnType 可以省略。否则,指定 DllCall 类型表中的参数类型之一。还支持星号后缀。
Arg 的字符串参数不得用引号 ("") 括起来。以数字开头的参数会被视为数字,因此 0ABC 会被视为 0。也允许使用十六进制值,因此 0xA 会转换为 10。
#DllImport, SendMsg,user32\SendMessage,PTR,0,UInt,0x999,PTR,111,PTR,222,PTR
OnMessage(0x999,"Ox999")
; DllCall("SendMessage","PTR",A_ScriptHwnd,"UINT",0x999,"PTR",111,"PTR",222,"PTR")
SendMsg(A_ScriptHwnd)
SendMsg % A_ScriptHwnd
; DllCall("SendMessage","PTR",A_ScriptHwnd,"UINT",0x999,"PTR",1,"PTR",2,"PTR")
SendMsg(A_ScriptHwnd,,1,2)
SendMsg ,A_ScriptHwnd,,1,2
ExitApp
Ox999(w:=0,l:=0,m:=0,h:=0){
MsgBox % w "`n" l "`n" m "`n" h
return 1
}
; 将 RGB_TO_BGR 函数导入为十六进制(以 : 分隔),第一个十六进制是 32 位版本,第二个十六进制是 64 位版本。
; DWORD RGB_TO_BGR(COLORREF rgb){
; return ((rgb & 255) << 16) | (((rgb >> 8) & 255) << 8) | (rgb >> 16);
; }
#DllImport,RGB_TO_BGR,8B4C24040FB6C18BD1C1E01081E200FF00000BC2C1E9100BC1C3:0FB6C18BD1C1E910C1E01081E200FF00000BC20BC1C3,UInt,,CDecl UInt
MsgBox % format("0x{1:X}",RGB_TO_BGR(0xAABBCC))