【问题标题】:Hooking with DLL a game hook使用 DLL 挂钩游戏挂钩
【发布时间】: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...的上下文中创建另一个变量...

标签: c++ c visual-c++


【解决方案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,但它不起作用。它只会让我的游戏崩溃。
  • 太棒了。问题解决了。您的新问题与您在此问题中描述的错误无关。请点击我的答案旁边的复选框,将其选为官方解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2021-02-13
相关资源
最近更新 更多