ahkExecuteLine

从给定行指针执行脚本的导出函数。


OutputVar := ahkExecuteLine(LinePointer, Mode, Wait)
函数示例: LinePointer := DllCall("AutoHotkey.dll\ahkExecuteLine", "PTR", LinePointer, "UInt", 0, "UInt", 0, "PTR")
                  VarPointer := DllCall("AutoHotkey.exe\ahkExecuteLine", "PTR", LinePointer, "UInt", 0, "UInt", 0, "PTR")

参数

OutputVar(输出变量)

用于存储指向下一行的指针的变量名称。

LinePointer(行指针)

指向开始执行的行的指针。 NULL / false / 0 可用于获取指向第一行的指针。

Mode(模式)

0 - 不会执行并仅返回指向下一行的指针。
1 - 直到返回
2 - 直到_BLOCK_END
3 - ONLY_ONE_LINE

Wait(等待)

1(真)如果要等到执行完成,否则为 FALSE / NULL / 0。

相关

ahkFindFunc, ahkFindLabel, ahkassign

示例

dll:=AhkThread("#Persistent`nMyVar:=""Hello World!""`nReturn`nMsgBox `% MyVar") ; 启动一个新线程并设置 MyVar 变量。
hLine:=0
Loop 3 ; 检索指向第四个可执行行的指针。
 hLine := dll.ahkExecuteLine[hLine]
dll.ahkExecuteLine[hLine,1,1] ; 从第4行开始执行



; ---------------- 高级示例 ----------------
MsgBox this line will be executed twice
; AHK Structures
global _AHKDerefType := "LPTSTR marker,{_AHKVar *var,_AHKFunc *func},BYTE is_function,param_count,WORD length"
global _AHKExprTokenType := "{__int64 value_int64,double value_double,struct{{PTR *object,_AHKDerefType *deref,_AHKVar *var,LPTSTR marker},{LPTSTR buf,size_t marker_length, BOOL is_lvalue}}},UINT symbol,{_AHKExprTokenType *circuit_token, LPTSTR mem_to_free}"
global _AHKArgStruct := "BYTE type,bool is_expression,WORD length,LPTSTR text,_AHKDerefType *deref,_AHKExprTokenType *postfix"
global _AHKBreakPoint := "INT id,BYTE type,BYTE state,bool temporary"
global _AHKLine := "BYTE mActionType,mArgc,WORD mFileIndex,UINT mLineNumber,_AHKArgStruct *mArg,PTR *mAttribute,_AHKLine *mPrevLine,*mNextLine,*mRelatedLine,*mParentLine,_AHKBreakPoint *mBreakPoint"
global _AHKLabel := "PTR vTable,LPTSTR mName,_AHKLine *mJumpToLine,_AHKLabel *mPrevLabel,*mNextLabel"
global _AHKFuncParam := "_AHKVar *var,WORD is_byref,default_type,{LPTSTR default_str,Int64 default_int64,Double default_double}"
If (A_PtrSize = 8)
	global _AHKRCCallbackFunc := "UINT64 data1,data2,BYTE actual_param_count,create_new_thread,event_info,*_AHKFunc func"
else
	global _AHKRCCallbackFunc := "ULONG data1,data2,data3,data4,data5,BYTE actual_param_count,create_new_thread,event_info,*_AHKFunc func"
global _AHKFunc := "PTR vTable, LPTSTR mName, {PTR mBIF, _AHKLine *mJumpToLine},_AHKFuncParam *mParam, int mParamCount, mMinParamCount, PTR *mClass,_AHKVar **mGlobalVar, **mVar, **mLazyVar, **mStaticVar, **mStaticLazyVar, int mGlobalVarCount, mVarCount, mVarCountMax, mLazyVarCount, mStaticVarCount, mStaticVarCountMax, mStaticLazyVarCount, mInstances, BYTE mDefaultVarType, bool mIsBuiltIn, mIsVariadic, mPreprocessLocalVarsDone"
global _AHKVar := A_PtrSize ":{Int64 mContentsInt64,Double mContentsDouble,PTR mobject},{char *mByteContents,LPTSTR mCharContents},{UINT_PTR mLength,_AHKVar *mAliasFor},{UINT_PTR mByteCapacity,UINT_PTR mBIV},BYTE mHowAllocated,mAttrib,mScope,mType,LPTSTR mName"

hLine:=DllCall(A_AhkPath "\ahkExecuteLine","Ptr",hLine,"UInt",0,"UInt",0,"PTR") ; 获取指向当前脚本第一行的指针
mLine:=Struct(_AHKLine,hLine)

; 检查这是否是我们的脚本以及正确的行号,因为它可能包含在脚本启动之前执行的文件或静态行
While mLine.mFileIndex!=0 || mLine.mLineNumber!=1
  mLine[] := mLine.mNextLine ; 重新分配下一行并更新 Structure
DllCall(A_AhkPath "\ahkExecuteLine","Ptr",hLine,"UInt",3,"UInt",1,"PTR") ; 在当前线程中执行第一行