版本一:
/* 函数名: Single 设置互斥体,阻止脚本重复运行 功能与#SingleInstance差不多,只是这玩样可以自定义 另: 经测试发现#SingleInstance只识别脚本文件名,改名可重复运行, 在有热键的脚本里要使用 #SingleInstance,off 关闭此功能. 参数: 给这个脚本设置一个独一无二的识别字符串(指纹?) 返回值: 1 为重复,0 为第一次 例子: Single("7EF47F0D-4D37-542E-5787-90FDD196D04B") Single("123") */ ;========================= ;使用案例,脚本改名都没用,照样只能运行一个. #SingleInstance Off ; 关闭自带互斥功能 if (Single("456")) { ; 独一无二的字符串用于识别脚本,或者称为指纹? MsgBox,16,提示,程序已启动!`n请勿重复运行 ExitApp } MsgBox 运行中 Return Single(flag) { ;,返回1为重复,返回0为第一个运行 DllCall("CreateMutex", "Ptr", 0, "int", 0, "str", "Single_" flag) return A_LastError=0xB7 ? true : false }
版本二:
#Persistent #SingleInstance off ListLines F24::Return ;-- 限制单进程运行函数,放在脚本任意位置即可 OnlyOne(flag="") { local static init:=OnlyOne(A_ScriptName) hash:=0 Loop, Parse, flag hash:=(hash*31+Ord(A_LoopField))&0xFFFFFFFF MutexName:="Ahk_OnlyOne_" . hash While (Mutex:=DllCall("OpenMutex","uint",0x100000,"int",0,"str",MutexName)) { DllCall("CloseHandle", "ptr",Mutex) DetectHiddenWindows, % (dhw:=A_DetectHiddenWindows) ? "On":"On" WinGet, list, List, <<%flag%>> ahk_class AutoHotkeyGUI Loop, % list { WinGet, pid, PID, % "ahk_id " . list%A_Index% WinClose, ahk_pid %pid% ahk_class AutoHotkey,, 3 IfWinExist, ahk_pid %pid%,, Process, Close, %pid% } DetectHiddenWindows, %dhw% } DllCall("CreateMutex", "ptr",0, "int",0, "str",MutexName) IfEqual, A_LastError, 0xB7, ExitApp Gui, __OnlyOne__: Show, Hide, <<%flag%>> }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)