音频文件从自身资源读取源码.ahk
; 用U32编译此脚本后自身读取播放,用U64编译需要拷贝一份再读取才行,无法读取自身后播放 SetWorkingDir %A_ScriptDir% 编译打包音频文件() { ; 打包并不释放 FileInstall, zapmachine.wav, - } ; U32编译可以读取自身资源文件并播放 hModule := DllCall("LoadLibraryEx", "Str", A_ScriptFullPath, "Ptr", 0, "Int", 0x02, "Ptr") ; hModule := DllCall( "GetModuleHandle", "UInt", 0, "Ptr" ) ; 获取自身的句柄【类似上面那句】 ; U64编译可以获取自身文件,但无法播放提取文件。以下是处理方法 ; FileCopy, % A_ScriptFullPath, % A_Temp "\" A_ScriptName, 1 ; hModule := DllCall("LoadLibraryEx", "Str", A_Temp "\" A_ScriptName, "Ptr", 0, "Int", 0x02, "Ptr") Size := ResReadEx( Sound_JUMP, hModule, "ZAPMACHINE.WAV" ) ; 获取资源文件的WAV ; FileRead, Sound_JUMP, *c ZAPMACHINE.wav MsgBox % "文件大小:" Size "`n资源指针:" &Sound_JUMP PlaySoundAsync( Sound_JUMP ) ; 播放WAV DllCall("FreeLibrary", "Ptr", hModule) Sleep 3000 Return ; ResRead() By SKAN, http://www.autohotkey.com/board/topic/57631-crazy-scripting-resource-only-dll-for-dummies-36l-v07/?p=609282 ResReadEx( ByRef Var, hModule, Key ) { VarSetCapacity( Var, 128 ), VarSetCapacity( Var, 0 ) If hRes := DllCall( "FindResource", "Ptr", hModule, "Str", Key, "UInt", 10, "Ptr" ) If hData := DllCall( "LoadResource", "Ptr", hModule, "Ptr", hRes, "Ptr" ) If pData := DllCall( "LockResource", "Ptr", hData ) Return VarSetCapacity( Var, nSize := DllCall( "SizeofResource", "Ptr", hModule, "Ptr", hRes, "Ptr" ) ) , DllCall( "RtlMoveMemory", "Str", Var, "Ptr", pData, "UInt", nSize ) Return 0 } PlaySound( ByRef Sound ) { Return DllCall( "winmm.dll\PlaySound", "UInt", &Sound, "UInt", 0, "UInt", 0x6 ) ; SND_MEMORY := 0x4 | SND_NODEFAULT := 0x2 } PlaySoundAsync( ByRef Sound ) { ; http://www.autohotkey.com/board/topic/96484-read-wave-resource-from-exe-using-skans-dllread-possible/?p=609800 Return DllCall( "winmm.dll\PlaySound" ( A_IsUnicode ? "W" : "A" ), "Ptr", &Sound, "UInt", 0, "UInt", 0x7) }
音频外部读取.ahk
#NoEnv SetWorkingDir %A_ScriptDir% ResReadEx( Sound_JUMP, "zapmachine.wav" ) ;ResReadEx( Sound_GAMEOVER, hModule, "GAMEOVER.WAV" ) PlaySoundAsync( Sound_JUMP ) ;PlaySound( Sound_JUMP ) ;PlaySound( Sound_GAMEOVER ) Sleep 5000 ; ResRead() By SKAN, from http://www.autohotkey.com/board/topic/57631-crazy-scripting-resource-only-dll-for-dummies-36l-v07/?p=609282 ResReadEx( ByRef Var, Key ) { VarSetCapacity( Var, 128 ), VarSetCapacity( Var, 0 ) If ! ( A_IsCompiled ) { FileGetSize, nSize, %Key% FileRead, Var, *c %Key% Return nSize } If hRes := DllCall( "FindResource", "UInt", hModule, "Str", Key, "UInt", 10, "Ptr" ) If hData := DllCall( "LoadResource", "UInt", hModule, "UInt", hRes, "Ptr" ) If pData := DllCall( "LockResource", "UInt", hData ) Return VarSetCapacity( Var, nSize := DllCall( "SizeofResource", "UInt", hModule, "UInt", hRes, "Ptr" ) ) , DllCall( "RtlMoveMemory", "Str", Var, "UInt", pData, "UInt", nSize ) Return 0 } PlaySoundAsync( ByRef Sound ) { Return DllCall( "winmm.dll\PlaySound" ( A_IsUnicode ? "W" : "A" ), "UInt", &Sound, "UInt", 0, "UInt", 0x7 ) }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)