使用 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 挂钩游戏挂钩的主要内容,如果未能解决你的问题,请参考以下文章
使用 EasyHook (c#) 从 ntdll.dll 挂钩 NtCreateFile API
使用 UnhookWindowsHookEx() 取消挂钩时,多个程序崩溃