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