版本一:

/*  函数名: 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%>>
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。