Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DLL与绘图功能_C++ - Fatal编程技术网

C++ DLL与绘图功能

C++ DLL与绘图功能,c++,C++,main.cpp(dll) Funkcje.h 当我将这个dll注入游戏时,我看不到字母。 当我在一段时间内使用绘图功能时(1),字母会出现和消失。 如何使绘图功能始终处于游戏的顶端 #include <windows.h> #include <vector> #include "Funkcje.h" #include <cstdio> #include <string> BOOL WINAPI DllMain( HINSTANC

main.cpp(dll) Funkcje.h 当我将这个dll注入游戏时,我看不到字母。 当我在一段时间内使用绘图功能时(1),字母会出现和消失。 如何使绘图功能始终处于游戏的顶端

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

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,
    DWORD fdwreason,
    LPVOID lpReversed)
{
    switch (fdwreason)
    {
    case DLL_PROCESS_ATTACH:
        PAINTSTRUCT ps;
        HDC hdc;
            for (size_t i = 0; i < getToplevelWindows().size(); i++){
                hdc = GetDC(getToplevelWindows()[i]);
                TextOut(hdc, 150, 150, L"TEST", 4);
                ReleaseDC(getToplevelWindows()[i], hdc);
        }
        break;
    }

    return TRUE;
}
#包括
#包括
#包括“Funkcje.h”
#包括
#包括
布尔WINAPI DllMain(
HINSTANCE hinstDLL,
德沃德·弗雷森,
LPVOID(反向)
{
开关(FDSON)
{
案例DLL\u进程\u附加:
PAINTSTRUCT-ps;
HDC-HDC;
对于(size_t i=0;i加载DLL时,仅调用一次
DllMain
。这不是您应该放置代码的地方

为了正确地将代码“注入”到进程中(通过DLL或任何其他方式),您必须首先确定要钩住该进程中的哪个函数或事件

在本例中,我假设您希望钩住窗口事件
WM_PAINT
,这是系统发送到窗口过程的回调,告诉它应该出于任何原因重新绘制其内容。(但这可能并不总是正确的,因为程序可以使用其他方法更新窗口内容。)

因此,您要做的是找到要挂接的窗口句柄,并将其回调过程替换为您自己的回调过程:

WNDPROC originalProc = SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)myHookProc);
但当然,在定义了myHookProc并执行其钩住WM_PAINT的工作之前:

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;
}

如果要处理多个窗口,可能需要使用
std::unordered_map
来保持每个窗口句柄与其原始过程之间的关系。

DllMain
只调用一次。但是当我从“for”转到hdc);}有一段时间(1),绘图函数被调用了不止一次。是的,但现在它只是调用尽可能多的次数,消耗了所有可用的CPU。哈夫纳德是的,它调用了尽可能多的次数,它出现和消失了。我想把这个字符串放在最上面,这样它就不会消失。然后阅读我的答案:)和错误C2664:“LONG SetWindowLongW(HWND,int,LONG)”:无法将参数3从“LRESULT(u stdcall*)(HWND,UINT,WPARAM,LPARAM)”转换为“LONG”,我做错了什么,谢谢你的帮助;)尝试使用
(LONG_PTR)myHookProc
。如果我尝试(LONG_PTR)myHookProc,那么我会出现以下错误C2440:“初始化”:无法从“LONG”转换为“WNDPROC”