Plain text
复制到剪贴板
Open code in new window
EnlighterJS 3 Syntax Highlighter
; 自己提取,编译exe的可以直接用,未编译的需要修改
if objCount(Processlist:=GetProcessNameList(A_IsCompiled?A_ScriptName:RegExReplace(A_AhkPath,".+\\")))>1
{
thisPID := DllCall("GetCurrentProcessId")
loop,% objCount(Processlist)
{
if (thisPID<>Processlist[A_Index,2]){
process,Close,% Processlist[A_Index,2]
}
}
}
MsgBox 再运行一次脚本试试,运行只能存在一个
GetProcessNameList(ProcessName:=""){
list:="",tarr:=[]
s := 10240 ; 缓存和数组的大小(4 KB)
Process, Exist ; 设置 ErrorLevel 为这个正在运行脚本的 PID.
; 使用 PROCESS_QUERY_INFORMATION(0x0400) 获取此脚本的句柄:
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr")
; 打开此进程的可调整的访问令牌(TOKEN_ADJUST_PRIVILEGES = 32):
DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t)
VarSetCapacity(ti, 16, 0) ; 特权结构
NumPut(1, ti, 0, "UInt") ; 特权数组中的一个条目...
; 获取调试特权的本地唯一标识符:
DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid)
NumPut(luid, ti, 4, "Int64")
NumPut(2, ti, 12, "UInt") ; 启用这个特权: SE_PRIVILEGE_ENABLED = 2
; 使用新的访问令牌更新此进程的特权:
r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0)
DllCall("CloseHandle", "Ptr", t) ; 关闭此访问令牌句柄以节约内存.
DllCall("CloseHandle", "Ptr", h) ; 关闭此进程句柄以节约内存.
hModule := DllCall("LoadLibrary", "Str", "Psapi.dll") ; 通过预加载来提升性能.
s := VarSetCapacity(a, s) ; 接收进程列表标识符的数组:
DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r)
Loop, % r // 4 ; 把数组解析为 DWORD(32 位) 的标识符:
{
id := NumGet(a, A_Index * 4, "UInt")
; 打开进程: PROCESS_VM_READ(0x0010) | PROCESS_QUERY_INFORMATION(0x0400)
h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr")
if !h
continue
VarSetCapacity(n, s, 0) ; 接收模块基础名称的缓存:
e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
if !e ; 用于 64 位进程在 32 位模式时的回退方法:
if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
SplitPath n, n
DllCall("CloseHandle", "Ptr", h) ; 关闭进程句柄以节约内存
if (n && e){ ; 如果映像不是空的, 则添加到列表:
If (ProcessName&&ProcessName=n)
tarr.push([n,id])
else
list.=n "/" id "|"
}
}
DllCall("FreeLibrary", "Ptr", hModule) ; 卸载库来释放内存.
return !ProcessName?list:tarr
}
; 自己提取,编译exe的可以直接用,未编译的需要修改 if objCount(Processlist:=GetProcessNameList(A_IsCompiled?A_ScriptName:RegExReplace(A_AhkPath,".+\\")))>1 { thisPID := DllCall("GetCurrentProcessId") loop,% objCount(Processlist) { if (thisPID<>Processlist[A_Index,2]){ process,Close,% Processlist[A_Index,2] } } } MsgBox 再运行一次脚本试试,运行只能存在一个 GetProcessNameList(ProcessName:=""){ list:="",tarr:=[] s := 10240 ; 缓存和数组的大小(4 KB) Process, Exist ; 设置 ErrorLevel 为这个正在运行脚本的 PID. ; 使用 PROCESS_QUERY_INFORMATION(0x0400) 获取此脚本的句柄: h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr") ; 打开此进程的可调整的访问令牌(TOKEN_ADJUST_PRIVILEGES = 32): DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t) VarSetCapacity(ti, 16, 0) ; 特权结构 NumPut(1, ti, 0, "UInt") ; 特权数组中的一个条目... ; 获取调试特权的本地唯一标识符: DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) NumPut(luid, ti, 4, "Int64") NumPut(2, ti, 12, "UInt") ; 启用这个特权: SE_PRIVILEGE_ENABLED = 2 ; 使用新的访问令牌更新此进程的特权: r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0) DllCall("CloseHandle", "Ptr", t) ; 关闭此访问令牌句柄以节约内存. DllCall("CloseHandle", "Ptr", h) ; 关闭此进程句柄以节约内存. hModule := DllCall("LoadLibrary", "Str", "Psapi.dll") ; 通过预加载来提升性能. s := VarSetCapacity(a, s) ; 接收进程列表标识符的数组: DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r) Loop, % r // 4 ; 把数组解析为 DWORD(32 位) 的标识符: { id := NumGet(a, A_Index * 4, "UInt") ; 打开进程: PROCESS_VM_READ(0x0010) | PROCESS_QUERY_INFORMATION(0x0400) h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr") if !h continue VarSetCapacity(n, s, 0) ; 接收模块基础名称的缓存: e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s) if !e ; 用于 64 位进程在 32 位模式时的回退方法: if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) SplitPath n, n DllCall("CloseHandle", "Ptr", h) ; 关闭进程句柄以节约内存 if (n && e){ ; 如果映像不是空的, 则添加到列表: If (ProcessName&&ProcessName=n) tarr.push([n,id]) else list.=n "/" id "|" } } DllCall("FreeLibrary", "Ptr", hModule) ; 卸载库来释放内存. return !ProcessName?list:tarr }
; 自己提取,编译exe的可以直接用,未编译的需要修改
if objCount(Processlist:=GetProcessNameList(A_IsCompiled?A_ScriptName:RegExReplace(A_AhkPath,".+\\")))>1
{
  thisPID := DllCall("GetCurrentProcessId")
  loop,% objCount(Processlist)
  {
    if (thisPID<>Processlist[A_Index,2]){
      process,Close,% Processlist[A_Index,2]
    }
  }
}

MsgBox 再运行一次脚本试试,运行只能存在一个

GetProcessNameList(ProcessName:=""){
  list:="",tarr:=[]
  s := 10240  ; 缓存和数组的大小(4 KB)

  Process, Exist  ; 设置 ErrorLevel 为这个正在运行脚本的 PID.
  ; 使用 PROCESS_QUERY_INFORMATION(0x0400) 获取此脚本的句柄:
  h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr")
  ; 打开此进程的可调整的访问令牌(TOKEN_ADJUST_PRIVILEGES = 32):
  DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t)
  VarSetCapacity(ti, 16, 0)  ; 特权结构
  NumPut(1, ti, 0, "UInt")  ; 特权数组中的一个条目...
  ; 获取调试特权的本地唯一标识符:
  DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid)
  NumPut(luid, ti, 4, "Int64")
  NumPut(2, ti, 12, "UInt")  ; 启用这个特权: SE_PRIVILEGE_ENABLED = 2
  ; 使用新的访问令牌更新此进程的特权:
  r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0)
  DllCall("CloseHandle", "Ptr", t)  ; 关闭此访问令牌句柄以节约内存.
  DllCall("CloseHandle", "Ptr", h)  ; 关闭此进程句柄以节约内存.

  hModule := DllCall("LoadLibrary", "Str", "Psapi.dll")  ; 通过预加载来提升性能.
  s := VarSetCapacity(a, s)  ; 接收进程列表标识符的数组:

  DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r)
  Loop, % r // 4  ; 把数组解析为 DWORD(32 位) 的标识符:
  {
    id := NumGet(a, A_Index * 4, "UInt")
    ; 打开进程: PROCESS_VM_READ(0x0010) | PROCESS_QUERY_INFORMATION(0x0400)
    h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr")
    if !h
      continue
    VarSetCapacity(n, s, 0)  ; 接收模块基础名称的缓存:
    e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
    if !e    ;  用于 64 位进程在 32 位模式时的回退方法:
      if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s)
        SplitPath n, n
    DllCall("CloseHandle", "Ptr", h)  ; 关闭进程句柄以节约内存
    if (n && e){  ; 如果映像不是空的, 则添加到列表:
      If (ProcessName&&ProcessName=n)
        tarr.push([n,id])
      else
        list.=n "/" id "|"
    }
  }
  DllCall("FreeLibrary", "Ptr", hModule)  ; 卸载库来释放内存.

  return !ProcessName?list:tarr
}

 

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