;原贴链接:https://github.com/tmplinshi/MinHook-AHK
#NoEnv
#SingleInstance, force
SetWorkingDir %A_ScriptDir%
OnExit,OnExits
; 自定义修改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")
}
原贴链接跳转
下载: https://wwt.lanzoul.com/b07ntrbxg 密码:8181