使用 DLL 挂钩游戏挂钩

Posted

技术标签:

【中文标题】使用 DLL 挂钩游戏挂钩【英文标题】:Hooking with DLL a game hook 【发布时间】:2014-12-20 11:32:17 【问题描述】:

我的 DLL

#include <windows.h>
#include <vector>
#include "Funkcje.h"

WNDPROC originalProc;
LRESULT CALLBACK myHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwreason,
    LPVOID lpReversed)

    switch (fdwreason)
    
    case DLL_PROCESS_ATTACH:
        WNDPROC originalProc = SetWindowLongPtr(getToplevelWindows()[1], GWLP_WNDPROC, (LONG_PTR)myHookProc);
        break;
    

    return TRUE;


LRESULT CALLBACK myHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

    LRESULT originalResult = originalProc(hWnd, uMsg, wParam, lParam); // call original first
    if (uMsg == WM_PAINT)
    
        PAINTSTRUCT ps;
        HDC hdc = GetDC(hWnd);
        TextOut(hdc, 150, 150, L"TEST", 4);
        ReleaseDC(hWnd, hdc);
    
    return originalResult;

Funkcje.h http://pastebin.com/dc5t5H8s

我遇到了 (LONG_PTR)myHookProc 的问题 我的编译器说错误 C2440: 'initializing' : cannot convert from 'LONG' to 'WNDPROC' 我不知道我现在能做什么。如果没有 (LONG_PTR),我的编译器说他不能从 'LRESULT' 转换为 'LONG'

【问题讨论】:

您应该显式地转换 SetWindowLongPtr 的返回值:originalProc = (WNDPROC)SetWindowLongPtr(getToplevelWindows()[1], GWLP_WNDPROC, (LONG_PTR)myHookProc);。此外,如果您想稍后访问 originalProc,则不应在 case DLL_PROCESS_ATTACH...的上下文中创建另一个变量... 【参考方案1】:

将签名改为:

LRESULT APIENTRY myHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

然后调用:

WNDPROC originalProc = (WNDPROC)SetWindowLongPtr(getToplevelWindows()[1], GWLP_WNDPROC, (LONG_PTR)myHookProc);

【讨论】:

我做到了pastebin.com/iBZJrfs2,但它不起作用。它只会让我的游戏崩溃。 太棒了。问题解决了。您的新问题与您在此问题中描述的错误无关。请点击我的答案旁边的复选框,将其选为官方解决方案。

以上是关于使用 DLL 挂钩游戏挂钩的主要内容,如果未能解决你的问题,请参考以下文章

从注入的 DLL 挂钩 DirectX EndScene

使用 EasyHook (c#) 从 ntdll.dll 挂钩 NtCreateFile API

使用 UnhookWindowsHookEx() 取消挂钩时,多个程序崩溃

使用 KeyboardProc / SetWindowsHookEx 从注入的 DLL 中挂钩键盘

用于 64 位操作系统的系统范围挂钩

SetWindowsHookEx 挂钩到每个正在运行的程序