以下dll注入到进程中后消息处理函数不执行

以下是dll的代码,使用远程线程注入进进程后无法处理消息循环(比如按下菜单1应该有弹窗但是并没有而且窗口不会阻塞),调试发现oldfun值始终为0,请问代码哪里有问题呀


#include "pch.h"
#include
#include"resource.h"
#include

WNDPROC oldfun = NULL;  //原来的过程处理函数要保留
LRESULT CALLBACK NewWindowProc(HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    if (uMsg == WM_COMMAND)
    {
        switch (LOWORD(wParam))
        {
        case ID_MENU_1:
        {
            MessageBox(hWnd, "this is 1", NULL, MB_OK);
            break;
        }
        case ID_MENU_2:
        {
            MessageBox(hWnd, "this is 2", NULL, MB_OK);
            break;
        }
        case ID_MENU_3:
        {
            MessageBox(hWnd, "this is 1", NULL, MB_OK);
            break;
        }
        default:
            break;
        }
    }
    return oldfun(hWnd, uMsg, wParam, lParam);
}

BOOL init(HMODULE hModule)
{
    //获取窗体句柄,设置菜单
    HMENU hm=LoadMenu(hModule, MAKEINTRESOURCE(IDR_MENU1));
    HWND hw = FindWindow(NULL, "A");
    SetMenu(hw, hm);
    if (hm == NULL || hw == NULL)
    {
        return FALSE;
    }
    
    //替换原有过程函数
    oldfun = (WNDPROC)SetWindowLong(hw, GWLP_WNDPROC, (LONG)NewWindowProc);
    return TRUE;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        
        if (init(hModule))
        {
            MessageBox(FindWindow(NULL, "A"), "finish!", "notice", MB_OK);
        }
        else
        {
            MessageBox(FindWindow(NULL, "A"), "Fail!", "notice", MB_OK);
        }
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
oldfun = (WNDPROC)SetWindowLong(hw, GWLP_WNDPROC, (LONG)NewWindowProc);

改为

oldfun = (WNDPROC)SetWindowLongPtr(hw, GWLP_WNDPROC, (LONG_PTR)NewWindowProc);

试试

这样子加了一句再调试也一样

img