包含dll打包下载地址:

 

代码片段:

#NoEnv
#SingleInstance, force
SetWorkingDir %A_ScriptDir%
OnExit,OnExits
;原贴链接:https://github.com/tmplinshi/MinHook-AHK

; 自定义修改Gui窗口类名、不再是默认的AutoHotkeyGUI【将以下调用放到脚本加载的头部已保生效】
Global NewClassName:="ScriptUIMainFrame"
HOOK1 := New MinHook("user32.dll", "CreateWindowExW", "CreateWindowExW_Hook")
HOOK2 := New MinHook("user32.dll", "RegisterClassExW", "RegisterClassExW_Hook")
; HOOK1.Enable()
; HOOK2.Enable()
MH_EnableHook()

Gui,+HWNDhRenameClass
Gui,Add,GroupBox,w300 h250 Section,
Gui,Add,Text,xs+15 ys+30 ,当前窗口Class为:
Gui,Add,Text,xs+15 y+10 h1 w270 0x10
Gui,Font,s22 bold
Gui,Add,Text,xs+15 y+5 w270 vShowClassName,
Gui,Show, AutoSize,自定义修改Gui窗口类名
WinGetClass,winclass,A
GuiControl,,ShowClassName,% winclass
Return

OnExits:
GuiClose:
  HOOK1 := HOOK2 := "" ; Remove hook
  ExitApp
Return

RegisterClassExW_Hook(lpwcx) {
  Global NewClassName

  lpszClassName := StrGet( NumGet(lpwcx+0, A_PtrSize == 8 ? 64 : 40, "Ptr") )
  if (lpszClassName = "AutoHotkeyGUI") {
    newClass := NewClassName<>""?NewClassName:"ScriptUIMainFrame"
    NumPut(&newClass, lpwcx+0, A_PtrSize == 8 ? 64 : 40, "Ptr")
  }

  return DllCall(Object(A_EventInfo).original, "ptr", lpwcx, "ushort")
}

CreateWindowExW_Hook(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) {
  Global NewClassName

  sClassName := StrGet(lpClassName)
  if (sClassName = "AutoHotkeyGUI") {
    newClass := NewClassName<>""?NewClassName:"ScriptUIMainFrame"
    lpClassName := &newClass
  }

  return DllCall(Object(A_EventInfo).original, "uint", dwExStyle, "ptr", lpClassName
    , "ptr", lpWindowName, "int", dwStyle, "int", X, "int", Y
    , "int", nWidth, "int", nHeight, "ptr", hWndParent, "ptr", hMenu
    , "ptr", hInstance, "ptr", lpParam, "ptr")
}

; v1.2.1 (2019-08-18)
; AHK version: U32/U64
class MinHook
{
  __New(ModuleName, ModuleFunction, CallbackFunction,dllpath:="")
  {
    static init
    this.dllpath:=dllpath
    if !init
      init := this.__MinHook_Load_Unload()

    if !IsFunc(CallbackFunction)
      throw "Function <" CallbackFunction "> does not exist."

    this.cbAddr := RegisterCallback(CallbackFunction, "F",, &this)

    if (ModuleName = "")
    {
      if err := MH_CreateHook(ModuleFunction, this.cbAddr, pOriginal)
        throw MH_StatusToString(err)
    }
    else
    {
      if !(ModuleName ~= "i)^(User32|Kernel32|ComCtl32|Gdi32)(\.dll)?$")
      {
        if !this.hModule := DllCall("LoadLibrary", "str", ModuleName, "ptr")
          throw "Failed loading module: " ModuleName
      }
      
      if err := MH_CreateHookApiEx(ModuleName, ModuleFunction, this.cbAddr, pOriginal, pTarget)
        throw MH_StatusToString(err)
    }
    
    this.original := pOriginal
    this.target := pTarget
  }

  __Delete()
  {
    MH_RemoveHook(this.target)
    DllCall("GlobalFree", "ptr", this.cbAddr, "ptr")
    if this.hModule
      DllCall("FreeLibrary", "ptr", this.hModule)
  }

  Enable() {
    if err := MH_EnableHook(this.target)
      throw MH_StatusToString(err)
  }

  Disable() {
    if err := MH_DisableHook(this.target)
      throw MH_StatusToString(err)
  }

  QueueEnable() {
    if err := MH_QueueEnableHook(this.target)
      throw MH_StatusToString(err)
  }

  QueueDisable() {
    if err := MH_QueueDisableHook(this.target)
      throw MH_StatusToString(err)
  }

  __MinHook_Load_Unload()
  {
    static _ := { base: {__Delete: MinHook.__MinHook_Load_Unload} }
    static hModule

    if _
    {
      if !dllFile := this._findDll()
        throw "Unable to find MinHook.dll"
      if !hModule := DllCall("LoadLibrary", "str", dllFile, "ptr")
        throw "Failed loading " dllFile
      if err := MH_Initialize()
        throw MH_StatusToString(err)
      return true
    }

    if hModule
    {
      DllCall("MinHook\MH_Uninitialize")
      DllCall("FreeLibrary", "ptr", hModule)
    }
  }

  _findDll()
  {
    if FileExist(this.dllpath)
      Return this.dllpath
    Else{
      dirs := { 4: [".",A_ScriptDir "\dll\x86", A_LineFile "\..", A_ScriptDir "\"]
        , 8: [".", A_ScriptDir "\dll\x64", A_LineFile "\..", A_ScriptDir "\"] }
      for i, dir in dirs[A_PtrSize]
        if FileExist(dir "\MinHook.dll")
          return dir "\MinHook.dll"
    }
  }
}


; 初始化MinHook库。在程序开始的时候你必须精确地调用这个函数一次
MH_Initialize() {
  return DllCall("MinHook\MH_Initialize")
}

; 取消MinHook库的初始化。你必须在程序结束时精确地调用这个函数一次。
MH_Uninitialize() {
  return DllCall("MinHook\MH_Uninitialize")
}

; 为处于禁用状态的指定目标函数创建一个钩子。
; 参数:
;	pTarget    [in]   指向目标函数的指针,将被detour函数覆盖。
;	pDetour    [in]   指向detour函数的指针,将覆盖目标函数。
;	ppOriginal [out]   一个指向trampoline函数的指针,用于调用原始目标函数。该参数可以为NULL。
MH_CreateHook(pTarget, pDetour, ByRef ppOriginal := 0) {
  return DllCall("MinHook\MH_CreateHook"
    , "ptr", pTarget
    , "ptr", pDetour
    , "uptr*", ppOriginal )
}

; 为处于禁用状态的指定API函数创建一个钩子。
; 参数:
;	pszModule  [in]  指向加载模块名称的指针,其中包含目标函数。
;	pszTarget  [in]  指向目标函数名的指针,被detour函数重写。
;	pDetour    [in]  指向将重写的detour函数的指针。目标函数。
;	ppOriginal [out] 一个指向trampoline函数的指针,它将用于调用原始目标函数。该参数可以为NULL。
MH_CreateHookApi(pszModule, pszProcName, pDetour, ByRef ppOriginal := 0) {
  return DllCall("MinHook\MH_CreateHookApi"
    , "str", pszModule
    , "astr", pszProcName
    , "ptr", pDetour
    , "uptr*", ppOriginal )
}

; 处于禁用状态的指定API函数创建一个钩子。
; 参数:
;	pszModule   [in]   指向加载模块名的指针,其中包含目标函数。
;	pszTarget   [in]   指向目标函数名的指针,被detour函数重写。
;	pDetour   [in]   指向detour函数的指针,该函数将重写目标函数。
;	ppOriginal   [out]   一个指向trampoline函数的指针用于调用原始目标函数。该参数可以为NULL。
;	ppTarget   [out] 指向要使用的目标函数的指针与其他功能。该参数可以为NULL。
MH_CreateHookApiEx(pszModule, pszProcName, pDetour, ByRef ppOriginal := 0, ByRef ppTarget := 0) {
  return DllCall("MinHook\MH_CreateHookApiEx"
    , "str", pszModule
    , "astr", pszProcName
    , "ptr", pDetour
    , "uptr*", ppOriginal
    , "uptr*", ppTarget )
}

; 移除一个已经创建的钩子。
; 参数:
;	pTarget   [in]   指向目标函数的指针。
MH_RemoveHook(pTarget) {
  return DllCall("MinHook\MH_RemoveHook", "ptr", pTarget)
}

/*
  #define MH_ALL_HOOKS NULL
*/

; 启用已经创建的钩子。
; 参数:
;	pTarget [in] 指向目标函数的指针。
;		如果该参数为MH_ALL_HOOKS,则所有已创建的hook为一次性启用。
MH_EnableHook(pTarget := 0) {
  return DllCall("MinHook\MH_EnableHook", "ptr", pTarget)
}

; 禁用已经创建的钩子。
; 参数:
;	pTarget [in] 指向目标函数的指针。
;		如果该参数为MH_ALL_HOOKS,则所有已创建的hook为一次性禁用。
MH_DisableHook(pTarget := 0) {
  return DllCall("MinHook\MH_DisableHook", "ptr", pTarget)
}

; 队列来启用已经创建的钩子。
; 参数:
;	pTarget [in] 指向目标函数的指针。
;		如果该参数为MH_ALL_HOOKS,则所有已创建的hook为排队等待启用。
MH_QueueEnableHook(pTarget := 0) {
  return DllCall("MinHook\MH_QueueEnableHook", "ptr", pTarget)
}

; 队列禁用已经创建的钩子。
; 参数:
;	pTarget [in] 指向目标函数的指针。
;		如果该参数为MH_ALL_HOOKS,则所有已创建的hook为排队被禁用。
MH_QueueDisableHook(pTarget := 0) {
  return DllCall("MinHook\MH_QueueDisableHook", "ptr", pTarget)
}

; 一次性应用所有排队的更改。
MH_ApplyQueued() {
  return DllCall("MinHook\MH_ApplyQueued")
}

; 将MH_STATUS转换为字符串形式的名称。
MH_StatusToString(status) {
  return DllCall("MinHook\MH_StatusToString", "int", status, "astr")
}

 

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